2013-03-26 2 views
7

Я хочу отобразить кнопки на массив кнопок и код не содержит ошибок во время компиляции, но есть сила близко, когда я запустить его:Массив кнопок в Android

Button buttons[]; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game_board_view); 

    // Set OnClick listeners 
    Button buttons[] = null; 
    buttons[0] = (Button)findViewById(R.id.buttonOne); 
    buttons[1] = (Button)findViewById(R.id.buttonTwo); 
    buttons[2] = (Button)findViewById(R.id.buttonThree); 
    buttons[3] = (Button)findViewById(R.id.buttonFour); 
    buttons[4] = (Button)findViewById(R.id.buttonFive); 
    buttons[5] = (Button)findViewById(R.id.buttonSix); 
    buttons[6] = (Button)findViewById(R.id.buttonSeven); 
    buttons[7] = (Button)findViewById(R.id.buttonEight); 
    buttons[8] = (Button)findViewById(R.id.buttonMid); 
} 

LogCat:

03-26 21:42:51.455: D/dalvikvm(1156): GC_EXTERNAL_ALLOC freed 55K, 53% free 2566K/5379K, external 1625K/2137K, paused 98ms 
03-26 21:42:54.323: D/AndroidRuntime(1156): Shutting down VM 
03-26 21:42:54.323: W/dalvikvm(1156): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
03-26 21:42:54.343: E/AndroidRuntime(1156): FATAL EXCEPTION: main 
03-26 21:42:54.343: E/AndroidRuntime(1156): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.project.superwordwheel/edu.project.superwordwheel.GameView}: java.lang.NullPointerException 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.os.Looper.loop(Looper.java:123) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at dalvik.system.NativeStart.main(Native Method) 
03-26 21:42:54.343: E/AndroidRuntime(1156): Caused by: java.lang.NullPointerException 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at edu.project.superwordwheel.GameView.onCreate(GameView.java:43) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
03-26 21:42:54.343: E/AndroidRuntime(1156):  ... 11 more 
+0

у Вас есть ошибка в строке 43 –

+1

Помещенный Кнопка кнопки '[] = новые кнопки [9];' вместо 'кнопок кнопок [] = null'. Ваша ссылка на массив равна null. – DeeV

+0

попробуйте использовать arraylist

ответ

5

Ваш массив равен null, и вы пытаетесь получить в него индекс. Вот что вызывает NullPointerException. Ваш массив должен быть инициализирован, прежде чем вы сможете использовать его для хранения ваших кнопок.

Если вы хотите массив из девяти кнопок измените эту строку:

Button buttons[] = null; 

Для этого:

Button buttons[] = new Button[9]; 

Кроме того, у вас есть класс член Button buttons[] и локальная переменная функция, которая также назван Button buttons[]. Если это намеренно, то непременно продолжайте. В противном случае, вы хотите, чтобы в дальнейшем изменить свою линию к этому:

buttons[] = new Button[9]; 
3
Button buttons[] = null; 

кнопка должна быть создана, используя new оператора:

Button buttons[] = new Button[9]; 
2

Попробуйте следующий код:

private int objectLength = 9; //Array elements 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game_board_view); 

    Button[] buttons = new Button[objectLength]; 
    buttons[0] = (Button)findViewById(R.id.buttonOne); 
    buttons[1] = (Button)findViewById(R.id.buttonTwo); 
    buttons[2] = (Button)findViewById(R.id.buttonThree); 
    buttons[3] = (Button)findViewById(R.id.buttonFour); 
    buttons[4] = (Button)findViewById(R.id.buttonFive); 
    buttons[5] = (Button)findViewById(R.id.buttonSix); 
    buttons[6] = (Button)findViewById(R.id.buttonSeven); 
    buttons[7] = (Button)findViewById(R.id.buttonEight); 
    buttons[8] = (Button)findViewById(R.id.buttonMid); 
} 
+2

+1 для объявления элементов длины. – iSun

22

Это, как правило лучше, если у вас нет Кодируют константы, как в 9 в ваш код. И вам, как правило, не нужно.

Вы можете, например, поместить идентификаторы в массив и построить динамически размера List на их основе

private List<Button> buttons; 
private static final int[] BUTTON_IDS = { 
    R.id.buttonOne, 
    R.id.buttonTwo, 
    R.id.buttonThree, 
    R.id.buttonFour, 
    R.id.buttonFive, 
    R.id.buttonSix, 
    R.id.buttonSeven, 
    R.id.buttonEight, 
    R.id.buttonMid, 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game_board_view); 

    buttons = new ArrayList<Button>(); 
    // or slightly better 
    // buttons = new ArrayList<Button>(BUTTON_IDS.length); 
    for(int id : BUTTON_IDS) { 
     Button button = (Button)findViewById(id); 
     button.setOnClickListener(this); // maybe 
     buttons.add(button); 
    } 
} 
+0

Как динамический список помогает в производительности? –

+2

@MachMitch нет. Но производительность добавления 10 кнопок не имеет значения. Не имея необходимости выписывать все эти цифры, вы можете предотвратить ошибки. – zapl

+0

+1 для использования 'List

0

Пример:

Button[] buttons = initializeButtons(3); 
buttons[1].setText("I am button1"); 
buttons[2].setText("I am button2"); 
buttons[3].setText("I am button3"); 

ФУНКЦИЯ:

public Button[] initializeButtons(int x) { 
    Resources res = getResources(); 
    Button[] buttons = new Button[x]; 
    for (int i = 0; i < x; i++) { 
     String b = "button" + i; 
     buttons[i] = (Button) findViewById(res.getIdentifier(b, "id", getPackageName())); 
    } return buttons;//to prevent array out of bounds exception start from 0 
} 

NOTE : Убедитесь, что в вашем макете идентификатор кнопки, но ton1, button2, button3, .. .. и т. д.

0

У меня была такая ситуация, я выбрал другой подход. Я хранил id в целочисленном массиве.

Int[] btnarr = new int[3]; 

btn[0]=R.id.button1; // give your ID 

Button btn = (Button).findViewById(cc[i]); 
Смежные вопросы