1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. cle1000, 28.02.2012 #1
    cle1000

    cle1000 Threadstarter Neuer Benutzer

    Hallo,

    hoffentlich könnt ihr mir weiter helfen, ich versuche gerade tictactoe zu programmieren. es hat auch schon alles geklappt, bis ich einen eigenen button nämlich TicTacToeButton erzeugt habe, den ich anstelle von dem normalen Button verwenden möchte.
    Aber leider finde ich den grund für den Fehler nicht

    also hier mein code:

    TicTacToeActivity
    Code:
    package at.cbrunner;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class TicTacToeActivity extends Activity implements OnClickListener {
        TicTacToeButton[][] buttons = new TicTacToeButton[3][3];
        int counterX = 0;
        int counterO = 0;
        boolean isX = true;
        TextView textViewStatus;
        Button buttonRestart;
        Button buttonReset;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            setButtons();
            textViewStatus = (TextView) findViewById(R.id.textViewStatus);
            setStatus();
            
            setContentView(R.layout.main);
        }
    
        private void setStatus() {
            textViewStatus.setText("X: " + counterX + " ... O:" + counterO);
        }
    
        private void setButtons() {
    
            buttons[0][0] = (TicTacToeButton) findViewById(R.id.button1_1);
            buttons[0][1] = (TicTacToeButton) findViewById(R.id.button1_2);
            buttons[0][2] = (TicTacToeButton) findViewById(R.id.button1_3);
    
            buttons[1][0] = (TicTacToeButton) findViewById(R.id.button2_1);
            buttons[1][1] = (TicTacToeButton) findViewById(R.id.button2_2);
            buttons[1][2] = (TicTacToeButton) findViewById(R.id.button2_3);
    
            buttons[2][0] = (TicTacToeButton) findViewById(R.id.button3_1);
            buttons[2][1] = (TicTacToeButton) findViewById(R.id.button3_2);
            buttons[2][2] = (TicTacToeButton) findViewById(R.id.button3_3);
            
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    buttons[i][j].setOnClickListener(this);
                }
            }
    
            buttonReset = (Button) findViewById(R.id.buttonReset);
            buttonReset.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    counterX = 0;
                    counterO = 0;
                    setStatus();
                    resetAll();
                }
            });
    
            buttonRestart = (Button) findViewById(R.id.buttonRestart);
            buttonRestart.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    resetAll();
                }
            });
        }
    
        @Override
        public void onClick(View view) {
    
            ((Button) view).setEnabled(false);
            if (isX) {
                ((TicTacToeButton) view).setX(true);
                isX = false;
            } else {
                ((TicTacToeButton) view).setO(true);
                isX = true;
            }
    
            if (check()) {
                setButtonsEnable(false);
                setStatus();
            }
    
        }
    
        private void resetAll() {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    buttons[i][j].reset();
                }
            }
        }
    
        private void setButtonsEnable(boolean b) {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    buttons[i][j].setEnabled(b);
                }
            }
    
        }
    
        public boolean check() {
            //TODO 
            
            return false;
        }
    }
    
    TicTacToeButton
    Code:
    package at.cbrunner;
    
    import android.content.Context;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.Button;
    
    public class TicTacToeButton extends Button{
        private boolean x;
        private boolean o;
        private Drawable drawableX;
        private Drawable drawableO;
        private Drawable drawableButton;
        
    
        
        public TicTacToeButton(Context context) {    
            super(context);
            init();
            
        }
        
        public TicTacToeButton (Context c, AttributeSet a) {
            super(c, a);
            init();
        }
    
        public TicTacToeButton (Context c, AttributeSet a, int i) {
            super(c, a, i);
            init();
        }
        
        public void init(){
            x = false;
            o = false;
            
            
            drawableO = (Drawable)getResources().getDrawable(R.drawable.button_o);
            drawableX = (Drawable)getResources().getDrawable(R.drawable.button_x);
            drawableButton = (Drawable)getResources().getDrawable(R.drawable.button);
            this.setBackgroundDrawable(drawableButton);
        }
    
        public void reset(){
            this.setBackgroundDrawable(drawableButton);
            this.setEnabled(true);
        }
    
        public boolean isX() {
            return x;
        }
    
    
        public void setX(boolean x) {
            this.x = x;
            if (x){
                this.setBackgroundDrawable(drawableX);
                this.setEnabled(false);
            }
        }
    
    
        public boolean isO() {
            return o;
        }
    
    
        public void setO(boolean o) {
            this.o = o;
            if (o){
                this.setBackgroundDrawable(drawableO);
                this.setEnabled(false);
            }
        }
    }
    
    main.xml
    Code:
    02-28 21:53:05.195: I/Process(304): Sending signal. PID: 304 SIG: 9
    02-28 21:53:09.017: D/AndroidRuntime(326): Shutting down VM
    02-28 21:53:09.075: W/dalvikvm(326): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
    02-28 21:53:09.075: E/AndroidRuntime(326): Uncaught handler: thread main exiting due to uncaught exception
    02-28 21:53:09.075: E/AndroidRuntime(326): java.lang.RuntimeException: Unable to start activity ComponentInfo{at.cbrunner/at.cbrunner.TicTacToeActivity}: java.lang.NullPointerException
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.os.Handler.dispatchMessage(Handler.java:99)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.os.Looper.loop(Looper.java:123)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.ActivityThread.main(ActivityThread.java:4363)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at java.lang.reflect.Method.invokeNative(Native Method)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at java.lang.reflect.Method.invoke(Method.java:521)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at dalvik.system.NativeStart.main(Native Method)
    02-28 21:53:09.075: E/AndroidRuntime(326): Caused by: java.lang.NullPointerException
    02-28 21:53:09.075: E/AndroidRuntime(326):     at at.cbrunner.TicTacToeActivity.setButtons(TicTacToeActivity.java:51)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at at.cbrunner.TicTacToeActivity.onCreate(TicTacToeActivity.java:24)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    02-28 21:53:09.075: E/AndroidRuntime(326):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    02-28 21:53:09.075: E/AndroidRuntime(326):     ... 11 more
    02-28 21:53:09.105: I/dalvikvm(326): threadid=7: reacting to signal 3
    02-28 21:53:09.105: I/dalvikvm(326): Wrote stack trace to '/data/anr/traces.txt'
    
    Die NullPointerException tritt an dieser Stelle auf:
    buttons[j].setOnClickListener(this);

    Ich hoffe ihr könnt mir helfen!

    lg Clemens
     
  2. Neeldarax, 28.02.2012 #2
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Hi Clemens,

    stumpf gesagt, deine Buttons sind null.
    Es sollte also bei buttons[j], wenn i und j = 0 sind, auftretten.

    Deinen logischen Fehler findest du hier:
    Sollte klar sein oder?
    regards
     
    cle1000 gefällt das.
  3. v Ralle v, 28.02.2012 #3
    v Ralle v

    v Ralle v Android-Lexikon

    Ich könnte wetten, dasss das Problem am Layout liegt. Ein Button wird nicht gefunden, daher gibt es die NPE.

    Edit: Neeldarax war schneller und hat sogar Recht :D
     
    cle1000 gefällt das.
  4. cle1000, 29.02.2012 #4
    cle1000

    cle1000 Threadstarter Neuer Benutzer

    Hallo Neeldarax und vRallev,

    danke für euere antworten, leider ist mir noch nicht klar wo der fehler liegt, dass meine buttons null sind habe ich auch schon gewust aber warum?

    @neeldarax: ich bitte um die lösung?

    lg clemens
     
  5. Neeldarax, 29.02.2012 #5
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Hi,

    du rufst setButtons() auf bevor überhaupt ein Layout/View geladen/gesetzt wird. Die Methode findViewById(int) kann nur Views finden, die bereits einen Layout hinzugefügt worden sind.

    Um die Katze aus dem Sack zu lassen...
    Code:
    setContentView(R.layout.main);
    muss vor findViewById(int) ausgeführt werden.
    Erst dann kann findViewById(int) Views finden, die in der main.xml-Datei(wegen R.layout.main) stehen.

    Ist der Sinn von findViewById(int) klar geworden?

    regards
     
    cle1000 gefällt das.
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[OFFEN] Fehler beim Projekt importieren Android App Entwicklung 03.10.2017
[OFFEN] Bild per Intent an ListView übergeben und anzeigen Android App Entwicklung 13.08.2017
[ERLEDIGT] Android Studio Erste App-Programmierung Android App Entwicklung 02.08.2017
[NON-DEV] ADB -Nach Tutorial zur Speichererweiterung - Installation von Apps schlägt fehl Android App Entwicklung 24.06.2017
[ERLEDIGT] Hilfe bei Fehler in Quellcode benötigt Android App Entwicklung 23.06.2017
[GESCHLOSSEN] APK Zigalign Fehler Playstore Android App Entwicklung 13.06.2017
[GELÖST] Nach AS Update Fehler Error running app: Default Activity not found Android App Entwicklung 16.05.2017
Woher bekomme ich einen öffentlichen Server ? Android App Entwicklung 02.03.2017
Android SQLLite Fehler Android App Entwicklung 13.02.2017
Warum erhalte ich ein "IllegalArgumentException" zur Laufzeit ? Android App Entwicklung 02.02.2017
Du betrachtest das Thema "TicTacToe weiß nicht woher der fehler kommt" im Forum "Android App Entwicklung",