如何在android中动态设置按钮侦听器?
我正在开发一个应用程序,作为其他应用程序的模板,我需要创建一个包含类别的菜单(类别因应用程序而异)。我想要的是动态创建菜单。在一个如何在android中动态设置按钮侦听器?,android,button,reflection,listener,Android,Button,Reflection,Listener,我正在开发一个应用程序,作为其他应用程序的模板,我需要创建一个包含类别的菜单(类别因应用程序而异)。我想要的是动态创建菜单。在一个JSON文件中,我定义了必要的类别,并在屏幕上动态创建项目。我要做的是为每个类别(按钮)设置一个侦听器,这样当您单击每个类别时,可以执行不同的操作。为此,我使用了反射。下面是我打算做的一个代码示例 package com.example; public class MainActivity extends Activity { Button myButton;
JSON
文件中,我定义了必要的类别,并在屏幕上动态创建项目。我要做的是为每个类别(按钮
)设置一个侦听器
,这样当您单击每个类别时,可以执行不同的操作。为此,我使用了反射
。下面是我打算做的一个代码示例
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
*/
}
};
您正在尝试从静态类实例化非静态类
这是不可能的,因为MakeCallListener类不存在于静态上下文中(它绑定到MainActivity的实例)。尝试将其设置为静态的,或者让CustomListener类不是静态的。我认为您的类名为com.example.MainActivity.MakeCallListener(将$替换为.$表示匿名类)@njzk2谢谢您的回复。如果我按照你说的做,我会得到一个ClassNotFoundException,所以我的方法是正确的。肯定是因为这个原因没有抛出异常。我试图将CustomListener的create方法移动到MainActivity的主体(因此该方法是一个实例方法),但这并不能解决问题。继续生成一个
实例化异常
:$您可以发布堆栈跟踪吗?
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)