1

他のアプリのテンプレートとして機能するアプリケーションを開発しており、カテゴリを含むメニューを作成する必要があります (カテゴリはアプリによって異なります)。私が欲しいのは、メニューを動的に作成することです。ファイルでJSON必要なカテゴリを定義し、画面上に項目を動的に作成します。私がやろうとしているのは、各カテゴリ ( Button) に設定してListener、それぞれをクリックすると異なるアクションが実行されるようにすることです。これを行うには、 を使用していReflectionます。これが私がやろうとしていることのコード例です。

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)
4

1 に答える 1

0

静的クラスから静的でないクラスをインスタンス化しようとしています。

MakeCallListener クラスは静的コンテキストに存在しない (MainActivity のインスタンスに関連付けられている) ため、これは不可能です。静的にするか、CustomListener クラスを静的にしないようにしてください。

于 2012-11-14T16:37:05.217 に答える