2013-03-26 18 views
7

Ich mag die Tasten, um eine Reihe von Tasten zur Karte und der Code hat keine Fehler beim Kompilieren, aber es gibt Kraft zu schließen, wenn ich es laufen:Array von Schaltflächen im 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

Sie haben Fehler in Zeile 43 –

+1

Put 'Taste [] -Tasten = new Buttons [9];' statt 'Knopf-Taste [] = null'. Ihre Referenz auf das Array ist null. – DeeV

+0

versuchen, Arraylist

Antwort

5

Ihr Array ist null und Sie versuchen, einen Index in es zu bekommen. Das verursacht die NullPointerException. Ihr Array muss initialisiert werden, bevor Sie es zum Speichern Ihrer Schaltflächen verwenden können.

Wenn Sie ein Array von neun Tasten wollen dann diese Zeile ändern:

Button buttons[] = null; 

Um dies:

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

, haben Sie einen Teilnehmer Button buttons[] und eine lokale Funktionsvariablen, die auch ist genannt Button buttons[]. Wenn dies beabsichtigt ist, dann machen Sie weiter. Andernfalls sollten Sie um Ihre Linie, dies zu ändern:

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

Taste erstellt werden muss, die new Operator:

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

Versuchen Sie, den folgenden Code:

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 für Deklaration der Elementlänge. – iSun

22

Es ist in der Regel besser, wenn Sie keine Konstanten müssen hart codieren wie ein 9 in Ihre Code. Und das brauchst du normalerweise nicht.

können Sie zum Beispiel die IDs in ein Array setzen und bauen eine Größe dynamisch List basierend auf ihnen

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

Wie hilft die dynamische Liste bei der Leistung? –

+2

@MachMitch überhaupt nicht. Aber die Leistung des Hinzufügens von 10 Tasten spielt überhaupt keine Rolle. Wenn Sie nicht alle diese Zahlen ausschreiben müssen, können Sie Fehler vermeiden. – zapl

+0

+1 für die Verwendung von 'List

0

Verwendungsbeispiel:

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

FUNKTION:

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 
} 

HINWEIS : Stellen Sie sicher, dass in Ihrem Layout die Schaltfläche ID ist aber ton1, button2, button3, .. .. etc '

0

Ich hatte eine Situation wie diese, ich wählte einen anderen Ansatz. Ich speicherte ID in Integer-Array.

Int[] btnarr = new int[3]; 

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

Button btn = (Button).findViewById(cc[i]); 
Verwandte Themen