setOnClickListener создает исключение NullPointerException ТОЛЬКО внутри цикла.Зачем? - PullRequest
0 голосов
/ 25 ноября 2010
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, тогда как

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

отлично работает. Не имеет никакого смысла для меня.

1 Ответ

3 голосов
/ 25 ноября 2010

Я думаю, это потому, что ваш массив кнопок создается, когда btn1, ... все еще равны нулю.

Поэтому, когда вы вызываете BUTTONS [i] .setOnClickListener в цикле, вы на самом деле говорите null.setOnClickListener, который выдаст исключение.

Попробуйте настроить массив как переменную и посмотрите ПОСЛЕ ТОГО, КАК вы назначили btn1 и т. Д.

Не проверял, но что-то вроде этого может работать лучше ...

private ArrayList mBtns = new ArrayList ();

private void initButton (int id) { button = (Button) findViewById (id); button.setOnClickListener (это); 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 и выше).

...