2012-11-14 48 views
1

我正在開發一個應用程序,用作其他應用程序的模板,我需要創建一個帶有類別的菜單(類別因應用程序而異)。我想要的是動態創建菜單。在JSON文件中,我定義了必要的類別並在屏幕上動態創建項目。我打算做的是設置到每個類別(Button)a Listener,以便當您點擊每個執行不同的操作時。要做到這一點,我使用Reflection。這是我打算做的一個代碼示例。如何在android中動態設置按鈕監聽器?

package com.example; 

public class MainActivity extends Activity { 

Button myButton; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myButton = (Button) findViewById(R.id.button); 
    myButton.setOnClickListener(CustomListener.create("MakeCallListener")); 

} 

static class CustomListener { 

    public static OnClickListener create(String listenerName) { 

     OnClickListener actionListener = null; 

     try { 

      Class<?> classListener = Class 
        .forName("com.example.MainActivity$" + listenerName); 

      actionListener = (OnClickListener) classListener.newInstance(); 

     } catch (ClassNotFoundException e) { 
      Log.i("debug", e.getMessage()); 
     } catch (IllegalAccessException e) { 
      Log.i("debug", e.getMessage()); 
     } catch (InstantiationException e) { 
      Log.i("debug", e.getMessage()); 
     } catch (IllegalArgumentException e) { 
      Log.i("debug", e.getMessage()); 
     } 

     return actionListener; 
    } 
} 

class MakeCallListener implements OnClickListener { 

    public MakeCallListener() {} 

    @Override 
    public void onClick(View v) { 
     /* 
     * TODO: write the procedure to dial a phone number 
     */ 
    } 
}; 

}

的問題是我得到一個InstatiationException。錯誤消息是:

01-01 03:00:25.683:I/Bluumi(14206):無法實例化類com.example.MainActivity $ MakeCallListener;沒有空的構造函數

我沒有經驗使用反射和我試過的解決方案不工作。

這是堆棧跟蹤

java.lang.InstantiationException: can't instantiate class com.example.MainActivity$MakeCallListener; no empty constructor 
java.lang.Class.newInstanceImpl(Native Method) 
java.lang.Class.newInstance(Class.java:1319) 
com.example.MainActivity$CustomListener.create(MainActivity.java:36) 
com.example.MainActivity.onCreate(MainActivity.java:21) 
android.app.Activity.performCreate(Activity.java:4465) 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 
android.app.ActivityThread.access$600(ActivityThread.java:127) 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 
android.os.Handler.dispatchMessage(Handler.java:99) 
android.os.Looper.loop(Looper.java:137) 
android.app.ActivityThread.main(ActivityThread.java:4507) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:511) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
dalvik.system.NativeStart.main(Native Method) 
+0

post stackTrace – njzk2

+0

我覺得你的類被命名爲com.example.MainActivity.MakeCallListener(用$代替$,用於匿名類) – njzk2

+0

@ njzk2感謝您的回覆。如果我像你說的那樣做,我會得到一個ClassNotFoundException,所以我的方法是正確的。 –

回答

0

您試圖實例化一個類,這是不是從一個靜態靜態的。

這是不可能的,因爲您的MakeCallListener類不存在於靜態上下文中(它與MainActivity的實例關聯)。嘗試使其成爲靜態,或讓您的CustomListener類不是靜態的。

+0

絕對不是因爲這個原因拋出異常。我試圖將_CustomListener_的_create_方法移動到_MainActivity_的主體(這樣該方法就是一個實例方法)並且不能解決問題。繼續生成一個'InstantiationException':$ –

+0

你可以發佈你的堆棧跟蹤嗎? – njzk2