Создание массива кнопок, затем создание одного события onClick для всех

#java #android #arrays #button

#java #Android #массивы #кнопка

Вопрос:

Я пытаюсь создать массив кнопок, затем создать одно событие onClick для всех, вот мой код, когда я запускаю код, который я получаю (тестирование приложения (processcom.MyTest.testing) неожиданно остановился. Пожалуйста, попробуйте еще раз) Я не уверен, что, где ошибка. Должно быть, мне не хватает чего-то фундаментального, я не пытаюсь создать приложение, я просто использую Java, специально для Android.

Вот мой код

 package com.MyTest.testing;


import static android.widget.Toast.makeText;
import java.util.Random;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View;
import android.view.View.OnClickListener;


public class TreActivity extends Activity {
      /** Called when the activity is first created. */
//declaring some public int vars

int isPressed1 = 1;
int isPressed2 = 1;
int isPressed3 = 1;
int isPressed4 = 1;
int isPressed5 = 1;
int isPressed6 = 1;
int isPressed7 = 1;
int isPressed8 = 1;
int isPressed9 = 1;
int isPressed10 = 1;





@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


   myMethod();





}; //End of onCreate (Bundle savedInstanceState) 

public void myMethod() { 
    MyClickHandler handler = new MyClickHandler();  

    Button[] buttons = fnButtonArray();
    for (Button button : buttons) {  
       button.setOnClickListener(handler);  
       }  
 }  


class MyClickHandler implements View.OnClickListener {  
      public void onClick(View v) { 
        Toast.makeText(TreActivity.this, ((Button) v).getText() , Toast.LENGTH_SHORT).show();
      }  
 }


public Button[] fnButtonArray(){

    Button arrButtons[] = new Button[11];
      // started with 1 not 0 for the array to match the button numbers
    arrButtons[1] = (Button) findViewById(R.id.btn1);
    arrButtons[2] = (Button) findViewById(R.id.btn2);
    arrButtons[3] = (Button) findViewById(R.id.btn3);
    arrButtons[4] = (Button) findViewById(R.id.btn4);
    arrButtons[5] = (Button) findViewById(R.id.btn5);
    arrButtons[6] = (Button) findViewById(R.id.btn6);
    arrButtons[7] = (Button) findViewById(R.id.btn7);
    arrButtons[8] = (Button) findViewById(R.id.btn8);
    arrButtons[9] = (Button) findViewById(R.id.btn9);
    arrButtons[10]= (Button) findViewById(R.id.btn10);
    return arrButtons;

  }
  } //public class TreActivity extends Activity
  

Комментарии:

1. Почему вы создаете экземпляр массива из 26 элементов, а затем заполняете его только 10? Также массивы основаны на 0 — начинаются с 0, а не с 1.

2. Я исправил число с 26 на 11. и я начал с 1, а не с нуля, чтобы оно соответствовало количеству кнопок. итак, 0 ничего не имеет.

3. Но итератор ожидает элемент в 0. Таким образом, вы пытаетесь установить для OnClickListener значение null, поскольку 0-й элемент равен null.

4. Если 0 ничего не имеет, вы не можете использовать синтаксис for(:), поскольку это попытается назначить обработчик несуществующей кнопке. В идеале вы должны начать свой массив с 0. Но если вы продолжаете начинать с 1, вам нужно изменить этот цикл на for(i = 1; i <= buttons.length; i ) { buttons[i].setOnClickListener(handler); }

5. Я начну с 0 и создам только 10. и я пытаюсь это сейчас. Спасибо!

Ответ №1:

Похоже, вы получаете исключение NullReferenceException. Вы создаете массив размером 26, но заполняете только элементы со 2-го по 11-й. Затем вы перебираете все 26 элементов, пытаясь назначить обработчик щелчков. При попытке назначить обработчик щелчка нулевому элементу выдается исключение.

Вероятно, вы сможете увидеть эти подробности, проверив LogCat . Вы можете получить доступ к LogCat в Eclipse или запустить adb logcat из терминала.

Комментарии:

1. Я не думаю, что это в MediaPlayer.create(). Я снял это, и я все еще получаю ошибку. Я также убрал это из приведенного выше кода вопроса, чтобы другие, которые могут прочитать мой questino, не подумали, что это проблема. Просто чтобы вы знали, что мой MediaPlayer.create ..etc работал, я просто пытаюсь сделать свой код короче, создав массив кнопок и один onclick даже вместо того, чтобы перечислять 10 из них. (когда у меня было 10, все работало, как ожидалось).

2. Тем не менее, спасибо за попытку и за adb logcat, я повторю это и посмотрю, как я могу его использовать.