1

カスタムAlertDialogを表示しようとしています。メインのLinearLayout内にいくつかのボタンを含むLinearLayoutがあります。ボタンは特定の時間にのみ表示されることになっているので、レイアウトをGONEに設定しようとしています。ただし、これにより、以下に示す行にNPEがスローされます。何か案は?

 @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {      
        //case 0 removed for purposes of space
        case 1: 
            LayoutInflater layoutInflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view=layoutInflater.inflate(R.layout.ingamepopup,null);

        if(getPrefs.getBoolean("custom button checked"+gameNum, false)){
            customButtonLayout.setVisibility(View.VISIBLE);

            cb1.setText(Float.toString(getPrefs.getFloat("button 1 value"+gameNum,1)));
            cb2.setText(Float.toString(getPrefs.getFloat("button 2 value"+gameNum,5)));
            cb3.setText(Float.toString(getPrefs.getFloat("button 3 value"+gameNum,10)));
        } else
            customButtonLayout.setVisibility(View.GONE); //Line 172

        scoreChangeDialog = new AlertDialog.Builder(this)
        .setTitle("Score change")
        .setView(view)
        .create();

        return scoreChangeDialog;
        }
        return null;
    }

customButtonLayoutはonCreate()で定義されています:

customButtonLayout = (LinearLayout) findViewById(R.id.llCustomButtonsScoreChange);

そしてRで定義されます:

public static final int llCustomButtonsScoreChange=0x7f070015;

そしてLogCat:

      08-14 13:56:07.192: E/AndroidRuntime(10020): FATAL EXCEPTION: main
08-14 13:56:07.192: E/AndroidRuntime(10020): java.lang.NullPointerException
08-14 13:56:07.192: E/AndroidRuntime(10020):    at com.webs.pratia.scorekeeper.InGame.onCreateDialog(InGame.java:172)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.app.Activity.onCreateDialog(Activity.java:2472)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.app.Activity.createDialog(Activity.java:881)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.app.Activity.showDialog(Activity.java:2547)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.app.Activity.showDialog(Activity.java:2514)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at com.webs.pratia.scorekeeper.InGame.onListItemClick(InGame.java:121)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.app.ListActivity$2.onItemClick(ListActivity.java:321)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.widget.AdapterView.performItemClick(AdapterView.java:289)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.widget.ListView.performItemClick(ListView.java:3688)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1873)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.os.Handler.handleCallback(Handler.java:587)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.os.Looper.loop(Looper.java:123)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at android.app.ActivityThread.main(ActivityThread.java:4627)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at java.lang.reflect.Method.invokeNative(Native Method)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at java.lang.reflect.Method.invoke(Method.java:521)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-14 13:56:07.192: E/AndroidRuntime(10020):    at dalvik.system.NativeStart.main(Native Method)

編集

さらにテストを行った後、ingamepopup.xmlで定義されたすべての変数がnullを返すようです(cb1、cb2、cb3など)。ingamepopup.xmlは、アクティビティのメインxmlではありません。setContentView(ingame.xml)とingamepopup.xml(インフレーターによってインフレートされる)からビューにアクセスしようとすることの間にいくつかの競合がありますか?

4

2 に答える 2

0

この行の NPE は、customButtonLayout が null であることを意味します。View はクラスであるため、null にすることはできません。このことはご存知のようです。customButtonLayout が null の場合、これにはさまざまな理由がある可能性があります

  1. Create はまだ呼び出されていません。ビューを非表示にしようとすると、以前に表示されていたと思います。もしそうなら、それはオプションではありません。
  2. findViewById でビューが見つかりませんでした。同じロジックが適用されます。
  3. 最後のオプションは、初期化後に誰かが null に設定することです。これは非常に明白で、すでに分析されている可能性があります。
  4. この呼び出しは、別のインスタンスが初期化されている間に、あるインスタンスで実行されます。おそらく、customButtonLayout はスーパー クラスで定義され、サブタイプのすべてのインスタンスで同じ変数であると想定します。これは、静的メンバーの場合にのみ当てはまります。
于 2012-08-14T22:32:40.320 に答える
0

最後に問題が見つかりました。AlertDialog のビューからオブジェクト (正しい用語ですか?) を参照しようとしていたので、膨張させたビュー (view.findViewById(...)) を参照していました。findViewById(...) を記述することにより、プログラムはメイン アクティビティにロードされたビューから ID を見つけようとしていました。新しいコードは次のようになります。

    LayoutInflater layoutInflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view=layoutInflater.inflate(R.layout.ingamepopup,null); //This is the view that has to be referenced.

            mainLayout = (LinearLayout) view.findViewById(R.id.llScoreChange); 
//notice view.findViewById(...)
            customButtonLayout = (LinearLayout)  view.findViewById(R.id.llCustomButtonsScoreChange);
            plus = (ImageButton)  view.findViewById(R.id.ibPlusPU);
            minus = (ImageButton)  view.findViewById(R.id.ibMinusPU);
            cancel = (ImageButton)  view.findViewById(R.id.ibCancelPU);
            cb1 = (Button)  view.findViewById(R.id.bCustom1PU);
            cb2 = (Button)  view.findViewById(R.id.bCustom2PU);
            cb3 = (Button)  view.findViewById(R.id.bCustom3PU);
            score = (EditText)  view.findViewById(R.id.etScoreChange);

            if(getPrefs.getBoolean("custom button checked"+gameNum, false)){
                customButtonLayout.setVisibility(View.VISIBLE);

                cb1.setText(Float.toString(getPrefs.getFloat("button 1 value"+gameNum,1)));
                cb2.setText(Float.toString(getPrefs.getFloat("button 2 value"+gameNum,5)));
                cb3.setText(Float.toString(getPrefs.getFloat("button 3 value"+gameNum,10)));
            } else{
                customButtonLayout.setVisibility(View.GONE);
            }

            scoreChangeDialog = new AlertDialog.Builder(this)
            .setTitle("Score change")
            .setView(view)
            .create();

            return scoreChangeDialog;
        }
于 2012-08-16T04:26:22.027 に答える