2010-11-25 4 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); 
} 

는 NullPointerException을 발생시킵니다. 반면setOnClickListener는 for 루프 내에서만 NullPointerException을 발생시킵니다. 왜?

btn1.setOnClickListener(this); 
btn2.setOnClickListener(this); 
btn3.setOnClickListener(this); 
btn4.setOnClickListener(this); 

는 정상적으로 작동합니다. 나에게 어떤 의미가 없지.

+0

btn1을 네 번 사용했습니다. btn2, 3 또는 4가 존재하지 않을 수 있습니다 (즉, findViewById가 null을 반환합니다). Btw, 왜 1시에 시작하니? 왜 0이 아니겠습니까? – EboMike

+0

미안, 나는 실험하고 있었다. 지금 코드를 수정했습니다. –

답변

3

나는 Button 배열이 btn1, ...이 여전히 null 일 때 만들어 졌다고 생각합니다.

그래서 루프에서 BUTTONS [i] .setOnClickListener를 호출하면 예외를 발생시키는 null.setOnClickListener가 실제로 발생합니다.

등의 변수와 세이 당신이 할당 한 후 인 btn1으로 배열을 설정하십시오

그것을 테스트하지 않았하지만 이런 일이 더 잘 작동 할 수 ...

개인의 ArrayList mBtns = 새로운 ArrayList();

private void initButton (int id) { button = (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 –