2012-11-14 45 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