2010-11-25 16 views
0
private final Button[] BUTTONS = { 
    btn1, btn2, btn3,btn4 
}; 

... 

btn1 = (Button) this.findViewById(R.id.btn_1); 
btn2 = (Button) this.findViewById(R.id.btn_2); 
btn3 = (Button) this.findViewById(R.id.btn_3); 
btn4 = (Button) this.findViewById(R.id.btn_4); 

... 

int n = BUTTONS.length; 
for(int i=0; i<n; i++) { 
    if(DEBUG) Log.d(TAG, String.valueOf(i)); 
    BUTTONS[i].setOnClickListener(this); 
} 

が正常に動作しますsetOnClickListenerはforループ内でのみNullPointerExceptionをスローします。どうして?

btn1.setOnClickListener(this); 
btn2.setOnClickListener(this); 
btn3.setOnClickListener(this); 
btn4.setOnClickListener(this); 
のに対し、NullPointerExceptionがスローされます。私には分かりません。

+0

btn1を4回使用しました。おそらく、btn2,3、または4が存在しない可能性があります(つまり、findViewByIdがnullを返します)。 Btw、なぜ私は1で始まるのですか?なぜ0でないのですか? – EboMike

+0

申し訳ありませんが、私は実験していました。私は今コードを修正しました。 –

答えて

3

あなたのButtons配列は、btn1、...がまだnullの場合に作成されるためだと思います。

ループ内でBUTTONS [i] .setOnClickListenerを呼び出すと、例外が発生するnull.setOnClickListenerが実際に表示されます。

あなたがBTN1を割り当てられたら=

民間のArrayList mBtns ...

がそれをテストしていませんが、このような何かがよりよく働くかもしれないなど、変数とSEYとして配列を設定してみてください新しいArrayList();

プライベートvoid initButton(int id){ button =(ボタン)findViewById(id); button.setOnClickListener(this); mBtns.add(ボタン); }

...

initButton(R.id.btn_1)。 initButton(R.id.btn_2); initButton(R.id.btn_3); initButton(R.id.btn_4);

また、ボタンが非常に似ていない場合は、レイアウト内の各ボタンにonClick属性を定義し、たくさんのコードを保存する方がよい場合があります(Android 1.6以降でのみ使用可能)。

+0

まあ、ありがとう@xtempore –

関連する問題