我正在開發一個應用程序,用作其他應用程序的模板,我需要創建一個帶有類別的菜單(類別因應用程序而異)。我想要的是動態創建菜單。在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)
post stackTrace – njzk2
我覺得你的類被命名爲com.example.MainActivity.MakeCallListener(用$代替$,用於匿名類) – njzk2
@ njzk2感謝您的回覆。如果我像你說的那樣做,我會得到一個ClassNotFoundException,所以我的方法是正確的。 –