# Android App Absturz beim Starten



## Til7373 (13. Jun 2016)

Hallo Leute,
Ich bin kein kompletter Anfänger mehr in Java sondern hab schon etwas Erfahrung in Sachen programmieren, in richtig Android Apps hab ich allerdings noch nicht sonderlich viel gemacht.
Ich wollte gerne ein Mathe Quiz machen. Wenn ihr den code seht denkt ihr wahrscheinlich was ich für eine Logik habe, aber das eigentliche problem ist, dass mein Programm beim Debuggen auf meinem Handy immer sofort abstürzt, obwohl es keine Fehlermeldungen zuvor gibt.
Hier jetzt noch einmal die mainActivity.java als TextDatei und die Fehlermeldung dann nach dem Debuggen.



```
06-13 20:40:53.808 7892-7892/com.andriod.tiljo.mathfix D/AndroidRuntime: Shutting down VM
06-13 20:40:53.818 7892-7892/com.andriod.tiljo.mathfix E/AndroidRuntime:
FATAL EXCEPTION: main
Process: com.andriod.tiljo.mathfix, PID: 7892
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.andriod.tiljo.mathfix/com.andriod.tiljo.mathfix.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:224
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2410)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
at android.os.Handler.dispatchMessage(Handler.java:10
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5345)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
                                                                             at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:68)
                                                                             at android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.java:146)
                                                                             at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:28)
                                                                             at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:41)
                                                                             at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:190)
                                                                             at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:172)
                                                                             at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:512)
                                                                             at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:184)
                                                                             at com.andriod.tiljo.mathfix.MainActivity.<init>(MainActivity.java:19)
                                                                             at java.lang.reflect.Constructor.newInstance(Native Method)
                                                                             at java.lang.Class.newInstance(Class.java:1606)
                                                                             at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2410)
                                                                             at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                             at android.os.Looper.loop(Looper.java:135)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5345)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at java.lang.reflect.Method.invoke(Method.java:372)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947)
```


----------



## Joose (14. Jun 2016)

Die Fehlermeldung ist doch eh eindeutig: NullPointerException
Es wird wo auf ein nicht initialisiertes Objekt zugegriffen.

Der StackTrace sagt das Zeile 19 in deiner Klasse "MainActivity" Code aufruft welcher die Exception verursacht.
Meine Vermutung: Du willst deine TextView Variablen zu früh initialisieren, der Kontext ist noch nicht ready.

Zu deinem Code:
Statt

```
switch (random) {
  case 1:
  korrekt = true;
  break;
  case 4:
  korrekt = true;
  break;
  case 5:
  korrekt = true;
  break;
  case 8:
  korrekt = true;
  break;
  case 11:
  korrekt = true;
  break;
  case 14:
  korrekt = true;
  break;
  case 15:
  korrekt = true;
  break;
  case 18:
  korrekt = true;
  break;
  default:
  t1.setText("");
  }
```
könntest du auch einfach 

```
switch (random) {
   case 1:
   case 4:
   case 5:
   case 8:
   case 11:
   case 14:
   case 15:
   case 18:
     korrekt = true;
     break;
   default:
     t1.setText("");
}
```
schreiben


----------



## Til7373 (14. Jun 2016)

ok verstehe ich aber ich kriege es nicht hin auf die Objekte zuzugreifen wen ich sie in 
public void onCreate(Bundle savedInstanceState) initialisiere. obwohl alles public ist und mit new und MainActivity.b1 klappt nicht.


----------



## Joose (14. Jun 2016)

Til7373 hat gesagt.:


> ... ich kriege es nicht hin auf die Objekte zuzugreifen wen ich sie in
> public void onCreate(Bundle savedInstanceState) initialisiere. obwohl alles public ist und mit new und MainActivity.b1 klappt nicht.



Wie greifst du auf die Objekte zu? Beispielcode.
So wie du es beschreibst hört es sich etwas falsch an


----------



## Til7373 (14. Jun 2016)

Im moment gar nicht weil ich jetzt die Objekte einfach außerhalb von 
public void onCreate(Bundle savedInstanceState) initialisiert habe was aber ja nicht funktioniert


----------



## Til7373 (14. Jun 2016)

```
boolean korrekt = true;
        int random = (int) (Math.random() * 20 )+1;
        TextView t1 = (TextView) findViewById(R.id.textView1);
        TextView t2 = (TextView) findViewById(R.id.textView);
        TextView t3 = (TextView) findViewById(R.id.textView2);
        TextView t4 = (TextView) findViewById(R.id.textView3);
        ImageButton b1 = (ImageButton) findViewById(R.id.imageButton2);
        ImageButton b2 = (ImageButton) findViewById(R.id.imageButton);
        ImageButton b3 = (ImageButton) findViewById(R.id.image_Button1);
```

Damit initialisiere ich alles was ich dann brauche.
Ich bin mir jetzt nicht sicher wie ich bei den Listeners auf diese Objekte zugreife.


----------



## Joose (14. Jun 2016)

Ja und dieser Code steht ja nicht im Konstruktor. Diese Zeilen werden vor dem Konstruktor Aufruf ausgeführt, zu diesem Zeitpunkt existieren die Komponenten aber noch nicht (der StackTrace verrät in Zeile 19 der Klasse wird der Fehler verursacht).
Daher würde ich die Initialisierungen in den Konstruktor verschieben (oder je nachdem obs bei Android da was eigenes spezielles gibt).


----------



## Til7373 (14. Jun 2016)

Das heißt also ich sollte die Initialisierung im Konstruktor und im listener initialisieren also zweimal?


----------



## Til7373 (14. Jun 2016)

ok das programm stürzt auf dem Handy nicht mehr ab
Allerdings muss ich es trotzdem schaffen die random zahl im Listener aus dem anderen Konstruktor zu holen weil ich die gleiche zahl brauche.also im ersten Konstruktor wird mit ner switch schleife alles durchgegangen was bei math.random() kommt und macht daraufhin die textfelder voll.
im listener muss allerdings auch überprüft werden wenn ich auf beispielsweise den ersten Button klicke und die random zahl diese ist wo sich das Ergebnis tatsächlich auf diesem button befindet.
die random zahl muss allerdings in beiden konstruktoren die gleiche sein


----------



## Til7373 (15. Jun 2016)

so ich bin jetzt etwas weiter aber es klappt alles immer noch nicht gut.
und zwar kann ich auf den zweiten und dritten button klicken und es passiert auch wenn das ergebnis falsch ist und beim klick auf den ersten button stürzt das programm immer ab.
hier einmal die MainActivity und beim buttonklick wird die onclick.java ausgeführt.


```
package com.andriod.tiljo.mathfix;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {


    public static int random;

    public int setRandom() {
        return random;
    }

    public static boolean korrekt;

    public boolean getKorrekt() {
        return korrekt;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
random = (int)(Math.random()*20)+1;
korrekt = true;
        TextView t1 = (TextView) findViewById(R.id.textView1);
        TextView t2 = (TextView) findViewById(R.id.textView);
        TextView t3 = (TextView) findViewById(R.id.textView2);
        TextView t4 = (TextView) findViewById(R.id.textView3);
        ImageButton b1 = (ImageButton) findViewById(R.id.imageButton2);
        ImageButton b2 = (ImageButton) findViewById(R.id.imageButton);
        ImageButton b3 = (ImageButton) findViewById(R.id.image_Button1);

if(korrekt==false){
    System.exit(0);
}
        int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;


        a1 = 84;
        a2 = 15;
        a3 = 13;
        a4 = 12;
        a5 = 35;
        a6 = 12;
        a7 = 0;
        a8 = 16;
        a9 = -13;
        a10 = 19;
        a11 = 77;
        a12 = 8;
        a13 = 20;
        a14 = 32;
        a15 = 4;
        a16 = 18;
        a17 = 30;
        a18 = 200;
        a19 = 15;
        a20 = 9;
        String a1s, a2s, a3s, a4s, a5s, a6s, a7s, a8s, a9s, a10s, a11s, a12s, a13s, a14s, a15s, a16s, a17s, a18s, a19s, a20s;
        a1s = String.valueOf(a1);
        a2s = String.valueOf(a2);
        a3s = String.valueOf(a3);
        a4s = String.valueOf(a4);
        a5s = String.valueOf(a5);
        a6s = String.valueOf(a6);
        a7s = String.valueOf(a7);
        a8s = String.valueOf(a8);
        a9s = String.valueOf(a9);
        a10s = String.valueOf(a10);
        a11s = String.valueOf(a11);
        a12s = String.valueOf(a12);
        a13s = String.valueOf(a13);
        a14s = String.valueOf(a14);
        a15s = String.valueOf(a15);
        a16s = String.valueOf(a16);
        a17s = String.valueOf(a17);
        a18s = String.valueOf(a18);
        a19s = String.valueOf(a19);
        a20s = String.valueOf(a20);


        String ar1, ar2, ar3, ar4, ar5, ar6, ar7, ar8, ar9, ar10, ar11, ar12, ar13, ar14, ar15, ar16, ar17, ar18, ar19, ar20;
        ar1 = "8x10+4";
        ar2 = "5+6+2+10-8";
        ar3 = "20:2+3";
        ar4 = "6x20:10";
        ar5 = "5x(10-3)";
        ar6 = "(5+3-2)x2";
        ar7 = "8-10+2";
        ar8 = "4x2²";
        ar9 = "5-3x6";
        ar10 = "4+9+3x2";
        ar11 = "80,5-7*0,5";
        ar12 = "(4-3)x8";
        ar13 = "30:3+10";
        ar14 = "56-20-4";
        ar15 = "5:2+1,5";
        ar16 = "17+7-2*3";
        ar17 = "8x3+6";
        ar18 = "20x5+100";
        ar19 = "45x2:6";
        ar20 = "(8-5)²";


        switch (random) {
            case 1:
                t1.setText(ar1);
                t2.setText(a1s);
                t3.setText(a3s);
                t4.setText(a8s);
                break;
            case 2:
                t1.setText(ar2);
                t3.setText(a2s);
                t2.setText(a9s);
                t4.setText(a12s);
                break;
            case 3:
                t1.setText(ar3);
                t4.setText(a3s);
                t2.setText(a15s);
                t3.setText(a19s);

                break;
            case 4:
                t1.setText(ar4);
                t2.setText(a4s);
                t3.setText(a10s);
                t4.setText(a2s);
                break;

            case 5:
                t1.setText(ar5);
                t2.setText(a5s);
                t3.setText(a3s);
                t4.setText(a20s);
                break;

            case 6:
                t1.setText(ar6);
                t2.setText(a1s);
                t3.setText(a6s);
                t4.setText(a4s);
                break;

            case 7:
                t1.setText(ar7);
                t2.setText(a17s);
                t3.setText(a10s);
                t4.setText(a7s);
                break;

            case 8:
                t1.setText(ar8);
                t2.setText(a8s);
                t3.setText(a11s);
                t4.setText(a9s);
                break;

            case 9:
                t1.setText(ar9);
                t2.setText(a12s);
                t3.setText(a9s);
                t4.setText(a18s);
                break;

            case 10:
                t1.setText(ar10);
                t2.setText(a1s);
                t3.setText(a14s);
                t4.setText(a10s);
                break;

            case 11:
                t1.setText(ar11);
                t2.setText(a11s);
                t3.setText(a13s);
                t4.setText(a8s);
                break;

            case 12:
                t1.setText(ar12);
                t2.setText(a20s);
                t3.setText(a12s);
                t4.setText(a6s);
                break;

            case 13:
                t1.setText(ar13);
                t2.setText(a16s);
                t3.setText(a9s);
                t4.setText(a13s);
                break;

            case 14:
                t1.setText(ar14);
                t2.setText(a14s);
                t3.setText(a5s);
                t4.setText(a13s);
                break;

            case 15:
                t1.setText(ar15);
                t2.setText(a15s);
                t3.setText(a4s);
                t4.setText(a17s);
                break;

            case 16:
                t1.setText(ar16);
                t2.setText(a10s);
                t3.setText(a16s);
                t4.setText(a15s);
                break;

            case 17:
                t1.setText(ar17);
                t2.setText(a11s);
                t3.setText(a2s);
                t4.setText(a17s);
                break;

            case 18:
                t1.setText(ar18);
                t2.setText(a18s);
                t3.setText(a9s);
                t4.setText(a14s);
                break;

            case 19:
                t1.setText(ar19);
                t2.setText(a1s);
                t3.setText(a19s);
                t4.setText(a6s);
                break;

            case 20:
                t1.setText(ar20);
                t2.setText(a19s);
                t3.setText(a7s);
                t4.setText(a20s);
                break;

            default:
                t1.setText("");
        }




    }


}
```

und hier die OnClick.java:

```
public class OnClick {




    public static void sendMessage(View view) {
        MainActivity.korrekt=false;
        switch (view.getId()) {
            case R.id.imageButton2:
                switch (MainActivity.random) {
                    case 1:
                        MainActivity.korrekt = true;
                        break;
                    case 4:
                        MainActivity.korrekt = true;
                        break;
                    case 5:
                        MainActivity.korrekt = true;
                        break;
                    case 8:
                        MainActivity.korrekt = true;
                        break;
                    case 11:
                        MainActivity.korrekt = true;
                        break;
                    case 14:
                        MainActivity.korrekt = true;
                        break;
                    case 15:
                        MainActivity.korrekt = true;
                        break;
                    case 18:
                        MainActivity.korrekt = true;
                        break;
                    default:

               }

                break;




            case R.id.imageButton:
                switch(MainActivity.random){
                    case 2:
                        MainActivity.korrekt =true;
                        break;
                    case 6:
                        MainActivity.korrekt=true;
                        break;
                    case 9:
                        MainActivity.korrekt=true;
                        break;
                    case 12:
                        MainActivity.korrekt=true;
                        break;
                    case 16:
                        MainActivity.korrekt=true;
                        break;
                    case 19:
                        MainActivity.korrekt=true;
                        break;
                    default:

                }

                break;
            case R.id.image_Button1:
                switch(MainActivity.random){
                    case 3:
                        MainActivity.korrekt=true;
                        break;
                    case 7:
                        MainActivity.korrekt=true;
                        break;
                    case 10:
                        MainActivity.korrekt=true;
                        break;
                    case 13:
                        MainActivity.korrekt=true;
                        break;
                    case 17:
                        MainActivity.korrekt=true;
                        break;
                    case 20:
                        MainActivity.korrekt=true;
                        break;
                    default:

                }

                break;
            default:

                break; }
        if(MainActivity.korrekt=false){
            System.exit(0);
        }
    }
}
```

 und die Fehlermeldung beim klick auf den obesten button also image_button2 lautet:

06-15 15:53:20.976 25738-25738/com.andriod.tiljo.mathfix E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.andriod.tiljo.mathfix, PID: 25738
                                                                           java.lang.IllegalStateException: Could not find method setListFooter(View) in a parent or ancestor Context for androidnClick attribute defined on view class android.support.v7.widget.AppCompatTextView with id 'textView'
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325)
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
                                                                               at android.view.View.performClick(View.java:4791)
                                                                               at android.view.View$PerformClick.run(View.java:19884)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:135)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5345)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)


----------



## Joose (15. Jun 2016)

Til7373 hat gesagt.:


> und die Fehlermeldung beim klick auf den obesten button also image_button2 lautet:
> 
> 06-15 15:53:20.976 25738-25738/com.andriod.tiljo.mathfix E/AndroidRuntime: FATAL EXCEPTION: main
> Process: com.andriod.tiljo.mathfix, PID: 25738
> java.lang.IllegalStateException: Could not find method setListFooter(View) in a parent or ancestor Context for androidnClick attribute defined on view class android.support.v7.widget.AppCompatTextView with id 'textView'



Das steht doch genau was der Fehler ist. Es wird keine Methode mit den Namen "setListFooter" gefunden. Kontrolliere deinen Code ob du hier wo diese Methode aufrufst bzw. warum diese und wo diese deklariert sein sollte.


----------



## Til7373 (15. Jun 2016)

Ich weiß leider nicht was das für eine Methode ist


----------



## Til7373 (15. Jun 2016)

habs jetzt wieder anders und zwar alle listener in der MainActivity aber was komisch ist, dass nur der Listener vom ersten button funktioniert

```
b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v1) {
                MainActivity.korrekt = false;
                t1.setText("");
            }
        });
    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v2) {


            switch (MainActivity.random) {
                case 1:
                    MainActivity.korrekt = true;
                    break;
                case 4:
                    MainActivity.korrekt = true;
                    break;
                case 5:
                    MainActivity.korrekt = true;
                    break;
                case 8:
                    MainActivity.korrekt = true;
                    break;
                case 11:
                    MainActivity.korrekt = true;
                    break;
                case 14:
                    MainActivity.korrekt = true;
                    break;
                case 15:
                    MainActivity.korrekt = true;
                    break;
                case 18:
                    MainActivity.korrekt = true;
                    break;
                default:
                    System.exit(0);
            }
        }
    });




    b3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v3) {
            MainActivity.korrekt = false;

            switch (MainActivity.random) {
                case 3:
                    MainActivity.korrekt = true;
                    break;
                case 7:
                    MainActivity.korrekt = true;
                    break;
                case 10:
                    MainActivity.korrekt = true;
                    break;
                case 13:
                    MainActivity.korrekt = true;
                    break;
                case 17:
                    MainActivity.korrekt = true;
                    break;
                case 20:
                    MainActivity.korrekt = true;
                    break;
                default:
                    System.exit(0);

            }
        }
    });
```


----------



## Til7373 (15. Jun 2016)

also nur b1 funktioniert und auch perfekt mit der Überprüfung


----------



## AndiE (15. Jun 2016)

Momentan weiß ich noch, wie das funktionieren soll. Kannst du den Code so auskommentieren, dass z.B. nur der Zufallswert "1" benutzt wird. Dann kannst du genau sehen, wie das angezeigt wird. ich kann bei den Listenern keine Auswertefunktion erkennen. Soweit ich das sehe, erstellst du die UI-Objekte in der OnCreate. Üblicherweise verschwinden diese, wenn die OnCreate beendet wird. Daher werden solche Elemente üblicherweise als Klassenvariablen angelegt. Ansonsten wäre es gut, wenn alle Dateien, also auch die R- und die Manifestdatei mitgepostet wird. Dann kann man das Projekt mal im Emulator nachvollziehen.


----------



## Joose (16. Jun 2016)

AndiE hat gesagt.:


> Soweit ich das sehe, erstellst du die UI-Objekte in der OnCreate. Üblicherweise verschwinden diese, wenn die OnCreate beendet wird. Daher werden solche Elemente üblicherweise als Klassenvariablen angelegt.


Die Deklarierung war schon außerhalb der OnCreate Methode, aber ebenso die Initialisierung. Auf mein Anraten sollte die Initialisierung in die OnCreate verschoben werden.
Anscheinend wurde beides verschoben :/


----------



## Til7373 (16. Jun 2016)

```
public static int random;

    public int setRandom() {
        return random;
    }

    public static boolean korrekt;

    public boolean getKorrekt() {
        return korrekt;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

korrekt = true;
        final TextView t1 = (TextView) findViewById(R.id.textView1);
        final TextView t2 = (TextView) findViewById(R.id.textView);
        final TextView t3 = (TextView) findViewById(R.id.textView2);
        final TextView t4 = (TextView) findViewById(R.id.textView3);
         ImageButton b1 = (ImageButton) findViewById(R.id.imageButton2);
        ImageButton b2 = (ImageButton) findViewById(R.id.imageButton);
         ImageButton b3 = (ImageButton) findViewById(R.id.image_Button1);
```

so sieht das momentan aus, also werden die Objekte eigentlich in der OnCreate initialisiert.
Ist das richtig?


----------



## mrBrown (16. Jun 2016)

Deklariert und Initialisiert!
Die Deklarierung sollte aber außerhalb passieren, nur die Initialisierung innerhalb von#onCreate.


Gibts einen Grund, warum random und korrekt `static` sind?


----------



## Til7373 (16. Jun 2016)

```
int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;


        a1 = 84;
        a2 = 15;
        a3 = 13;
        a4 = 12;
        a5 = 35;
        a6 = 12;
        a7 = 0;
        a8 = 16;
        a9 = -13;
        a10 = 19;
        a11 = 77;
        a12 = 8;
        a13 = 20;
        a14 = 32;
        a15 = 4;
        a16 = 18;
        a17 = 30;
        a18 = 200;
        a19 = 15;
        a20 = 9;
        String a1s, a2s, a3s, a4s, a5s, a6s, a7s, a8s, a9s, a10s, a11s, a12s, a13s, a14s, a15s, a16s, a17s, a18s, a19s, a20s;
        a1s = String.valueOf(a1);
        a2s = String.valueOf(a2);
        a3s = String.valueOf(a3);
        a4s = String.valueOf(a4);
        a5s = String.valueOf(a5);
        a6s = String.valueOf(a6);
        a7s = String.valueOf(a7);
        a8s = String.valueOf(a8);
        a9s = String.valueOf(a9);
        a10s = String.valueOf(a10);
        a11s = String.valueOf(a11);
        a12s = String.valueOf(a12);
        a13s = String.valueOf(a13);
        a14s = String.valueOf(a14);
        a15s = String.valueOf(a15);
        a16s = String.valueOf(a16);
        a17s = String.valueOf(a17);
        a18s = String.valueOf(a18);
        a19s = String.valueOf(a19);
        a20s = String.valueOf(a20);

//random = 1 also gehts in den teil der schleife; ar1 ist die Rechnung die anderen Ergebnise.

random = 1;
switch (random) {
    case 1:
        t1.setText(ar1);
        t2.setText(a1s);
        t3.setText(a3s);
        t4.setText(a8s);
        break;
default:
    t1.setText("")
}


//Dann kommen die Listener und nur bei b1 funktioniert es (bei b2 ist ein Test weil das Textfeld t1 //wird auch nicht leer wenn ich auf den Button klicke also der Button geht nicht)
// Wenn ich den ersten Button klicke passiert nichts weil er in case 1 geht. wenn ich  zum //Beispiel random=2 mache und den ersten Button klicke dann schließt sich das programm.also b1 funktioniert

b2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v1) {
            MainActivity.korrekt = false;
            t1.setText("");
        }
    });
b1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v2) {


        switch (MainActivity.random) {
            case 1:
                MainActivity.korrekt = true;
                break;
            case 4:
                MainActivity.korrekt = true;
                break;
            case 5:
                MainActivity.korrekt = true;
                break;
            case 8:
                MainActivity.korrekt = true;
                break;
            case 11:
                MainActivity.korrekt = true;
                break;
            case 14:
                MainActivity.korrekt = true;
                break;
            case 15:
                MainActivity.korrekt = true;
                break;
            case 18:
                MainActivity.korrekt = true;
                break;
            default:
                System.exit(0);
        }
    }
});




b3.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v3) {
        MainActivity.korrekt = false;

        switch (MainActivity.random) {
            case 3:
                MainActivity.korrekt = true;
                break;
            case 7:
                MainActivity.korrekt = true;
                break;
            case 10:
                MainActivity.korrekt = true;
                break;
            case 13:
                MainActivity.korrekt = true;
                break;
            case 17:
                MainActivity.korrekt = true;
                break;
            case 20:
                MainActivity.korrekt = true;
                break;
            default:
                System.exit(0);

        }
    }
});
```

Ich hoffe das schafft etwas übersichtlichkeit


----------



## Til7373 (16. Jun 2016)

nein eigentlich nicht


----------



## mrBrown (16. Jun 2016)

Das ist eher alles andere als Übersichtlich 

Du solltest dir mal Arrays angucken und den Tipp aus #2 beherzigen 



Til7373 hat gesagt.:


> nein eigentlich nicht


Dann mach sie nicht `static`


----------



## Til7373 (16. Jun 2016)

obwohl doch und zwar gibt mir in den Listener eine Fehlermeldung wenn ich die Variablen nicht static mache:
Non-static_Field "korrekt" cannot be referneced from a non-static context


----------



## Til7373 (16. Jun 2016)

also versteht man nicht was da passieren soll bzw. passiert


----------



## Til7373 (16. Jun 2016)

und sorry dass ich keine Arrays benutze sollt ich benutzen aber ist jetzt aufwendig umzuschreiben aber beim weiteren programmieren werd ich es verwenden danke


----------



## mrBrown (16. Jun 2016)

Til7373 hat gesagt.:


> also versteht man nicht was da passieren soll bzw. passiert


Doch, es ist nur extrem unübersichtlich und umständlich.
Hat auch nicht wirklich was mit deinem Problem zu tun, oder?



Til7373 hat gesagt.:


> obwohl doch und zwar gibt mir in den Listener eine Fehlermeldung wenn ich die Variablen nicht static mache:
> Non-static_Field "korrekt" cannot be referneced from a non-static context


Du versuchst weiterhin auf eine statische Variable zuzugreifen, die gibts eben nicht. Du musst auf die Instanzvariable zugreifen. Hat aber auch nichts mit deinem Problem zu tun, sind nur Punkte, die du beachten solltest, weil sie wahrscheinlich sonst irgendwann zu Problemen führen.




Til7373 hat gesagt.:


> und sorry dass ich keine Arrays benutze sollt ich benutzen aber ist jetzt aufwendig umzuschreiben aber beim weiteren programmieren werd ich es verwenden danke



Es würde deinen Code ziemlich vereinfachen


----------



## Til7373 (16. Jun 2016)

ok tut mir leid für die Sachen. ich bin nicht so geübt in solchen Dingen


----------



## Til7373 (16. Jun 2016)

wie soll ich die UIs außerhalb von onCreate deklarieren


----------



## AndiE (16. Jun 2016)

Ich habe einen Vorschlag: Mach ein neues Projekt in Eclipse auf. Erzeuge dort für dein Android-System deine vier Edit-Felder und drei Button. Lege nun einfach fest "1+1", "1","2" und "3". So wie ich das verstehe, soll der Benutzer auf den Button drücken, bei dem das richtige Ergebnis steht, in diesem Falle also dem 2ten. Nun sollte eine Meldung kommen: "richtig" mit einem Button "nächste Aufgabe". Dazu brauchst du noch ein Edit-Feld und einen Button. Wenn der falsche Button gedrückt wird, muss auch eine Meldung "falsch" mit Button "Noch mal versuchen" erscheinen. Für die Anzeige dieser Meldungen sind die Actionlistener verantwortlich.  Der üblicherweise notwendige "Exit"-Knopf fällt ja wohl neuerdings bei Android weg. Wie weit bekommst du diese Anwendung zu laufen? Wenn sie läuft, brauchst du nur die Abschnitte in dein jetziges Projekt zu kopieren. Der Code ist aber übersichtlicher, weil die ganzen Zuweisungen und switch fehlen. Hast du das Projekt schon mal mit SWT oder so programmiert?


----------



## Til7373 (16. Jun 2016)

nein bis jetzt noch nicht aber ich nehme mir das morgen mal vor.
is ne gute Idee


----------



## Joose (17. Jun 2016)

Til7373 hat gesagt.:


> wie soll ich die UIs außerhalb von onCreate deklarieren



Hier ein Beispiel um zu zeigen was der Unterschied zwischen der Deklaration einer Variable ist und deren Initialisierung!


```
public class MyClass {
    private int counter; // Deklaration einer int-Variable mit der Bezeichnung counter

    public MyClass(int counter) {
        this.counter = counter; // Initialisierung der Instanzvariable mit der Bezeichnung counter;
    }
}
```
Die Deklaration legt nur fest es gibt nun eine Variable im entsprechenden Scope. Die Initialisierung legt dann den Anfangs-/Startwert fest.


----------



## Til7373 (17. Jun 2016)

ja sorry das wusst ich schon weil sonst könnte ich eigentlich kein bisschen java.


----------



## mrBrown (17. Jun 2016)

Til7373 hat gesagt.:


> ja sorry das wusst ich schon weil sonst könnte ich eigentlich kein bisschen java.


Heißt das jetzt, du kannst kein Java und wusstest das nicht, oder du kannst Java, und wusstest das (warum dann die Frage?)

Und was ist denn jetzt noch das Problem?


----------



## Til7373 (17. Jun 2016)

ja ich wusste das


----------



## Til7373 (17. Jun 2016)

ich hatte nicht genau verstanden was ich machen soll


```
package test3;
import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;

public class test {
    static boolean korrekt;

    public static void main(String[]args) {
       
        JFrame frame = new JFrame("Mathfix");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 600);
        JPanel panel = new JPanel(new BorderLayout(5, 5));
        frame.setLayout(new BorderLayout(5,5));
       
       
        JTextField t1 = new JTextField("");
        JButton button1 = new JButton("");
        JButton button2 = new JButton("");
        JButton button3 = new JButton("");
        frame.getContentPane().add(BorderLayout.NORTH, t1);
        frame.getContentPane().add(BorderLayout.EAST, button1);
        frame.getContentPane().add(BorderLayout.SOUTH, button2);
        frame.getContentPane().add(BorderLayout.WEST, button3);
       
       
        frame.pack();
        frame.setVisible(true);
       
       
        String rechnung = "5+6-8";
        String ergebnis1 = "4";
        String ergebnis2 = "3";
        String ergebnis3 = "2";
        
       
        t1.setText(rechnung);
        button1.setText(ergebnis2);
        button2.setText(ergebnis1);
        button3.setText(ergebnis3);
   
        button1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                korrekt=true;
                System.out.println(korrekt);
            }
        });
       
        button2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                korrekt=false;
                System.out.println(korrekt);
            }
        });
       
        button3.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                korrekt=false;
                System.out.println(korrekt);
            }
        });
       
       

       
    }}
```


Hier ist jetzt mal das programm sehr vereinfacht.
Ich glaube aber dass es an den listeners in android liegt weil das ist ja hier nicht das gleiche.


----------



## AndiE (18. Jun 2016)

Soweit OK. Nun erstellst du eine Methode OnCreate, genau wie beim Android. Dann legst du für den Swing die gleiche Funktionalität in diese Methode wie beim Android-Gerät. Dann siehst du, was du ändern musst. 

Übrigens: der loop ist imme noch nicht geschlossen.


----------



## Til7373 (18. Jun 2016)

ich hab jetzt mein android programm etwas übersichtlicher gemacht dass heißt auf euren rat mit den arrays gehört und hab mehr kommentiert.#
ich hoffe man kann jetzt genau nachvollziehen was passiert.
ich hab in einem android app entwicklungs buch nochmal nachgeschlagen und die Listener genau danach geschrieben.
Trotzdem passieren nur die richtigen Sachen wenn ich auf den ersten Button klicke bei den anderen passiert einfach nie was.


```
package com.andriod.tiljo.mathfix;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {


//Buttons und textfelder
    TextView t1,t2,t3,t4;
    ImageButton b1,b2,b3;


//random zahl (rechnung)
  static  int random;


// variable korrekt
    public  static boolean korrekt;



    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//Aufruf der unten erstellten Listeners
        setButtonClickListener1();
        setButtonClickListener2();
        setButtonClickListener3();


        t1 = (TextView) findViewById(R.id.textView1);
        t2 = (TextView) findViewById(R.id.textView);
        t3 = (TextView) findViewById(R.id.textView2);
        t4 = (TextView) findViewById(R.id.textView3);

        korrekt = true;


//Ergebniise als Arrays
        String[] e = {"84", "15", "13", "12", "35", "12", "0", "16", "-13", "19", "77", "8", "20", "32", "4", "18", "30", "200", "15", "9"};


//Rechnungen als Arrays
        String[] r = {"8x10+4", "5+6+2+10-8", "20:2+3", "6x20:10", "5x(10-3)", "(5+3-2)x2", "8-10+2", "4x2²", "5-3x6", "4+9+3x2", "80,5-7*0,5", "(4-3)x8",
                "30:3+10", "56-20-4", "5:2+1,5", "17+7-2*3", "8x3+6", "20x5+100", "45x2:6", "(8-5)²"};

//Bei bestimmter radnom Rechnung anzeigen und ein richtiges und zwei falsche Ergebnisse irgendwo
        random = (int) (Math.random() * 20) + 1;
        switch (random) {
            case 1:
                t1.setText(r[0]);
                t2.setText(e[0]);
                t3.setText(e[2]);
                t4.setText(e[7]);
                break;
            case 2:
                t1.setText(r[1]);
                t3.setText(e[1]);
                t2.setText(e[8]);
                t4.setText(e[10]);
                break;
            case 3:
                t1.setText(r[2]);
                t4.setText(e[2]);
                t2.setText(e[14]);
                t3.setText(e[5]);

                break;
            case 4:
                t1.setText(r[3]);
                t2.setText(e[3]);
                t3.setText(e[9]);
                t4.setText(e[1]);
                break;

            case 5:
                t1.setText(r[4]);
                t2.setText(e[4]);
                t3.setText(e[2]);
                t4.setText(e[19]);
                break;

            case 6:
                t1.setText(r[5]);
                t2.setText(e[0]);
                t3.setText(e[5]);
                t4.setText(e[3]);
                break;

            case 7:
                t1.setText(r[6]);
                t2.setText(e[16]);
                t3.setText(e[9]);
                t4.setText(e[6]);
                break;

            case 8:
                t1.setText(r[7]);
                t2.setText(e[7]);
                t3.setText(e[10]);
                t4.setText(e[8]);
                break;

            case 9:
                t1.setText(r[8]);
                t2.setText(e[11]);
                t3.setText(e[8]);
                t4.setText(e[17]);
                break;

            case 10:
                t1.setText(r[9]);
                t2.setText(e[0]);
                t3.setText(e[13]);
                t4.setText(e[9]);
                break;

            case 11:
                t1.setText(r[10]);
                t2.setText(e[10]);
                t3.setText(e[12]);
                t4.setText(e[7]);
                break;

            case 12:
                t1.setText(r[11]);
                t2.setText(e[19]);
                t3.setText(e[11]);
                t4.setText(e[5]);
                break;

            case 13:
                t1.setText(r[12]);
                t2.setText(e[15]);
                t3.setText(e[8]);
                t4.setText(e[12]);
                break;

            case 14:
                t1.setText(r[13]);
                t2.setText(e[13]);
                t3.setText(e[4]);
                t4.setText(e[12]);
                break;

            case 15:
                t1.setText(r[14]);
                t2.setText(e[14]);
                t3.setText(e[3]);
                t4.setText(e[16]);
                break;

            case 16:
                t1.setText(r[15]);
                t2.setText(e[9]);
                t3.setText(e[15]);
                t4.setText(e[14]);
                break;

            case 17:
                t1.setText(r[16]);
                t2.setText(e[10]);
                t3.setText(e[1]);
                t4.setText(e[16]);
                break;

            case 18:
                t1.setText(r[17]);
                t2.setText(e[17]);
                t3.setText(e[8]);
                t4.setText(e[13]);
                break;

            case 19:
                t1.setText(r[18]);
                t2.setText(e[0]);
                t3.setText(e[18]);
                t4.setText(e[5]);
                break;

            case 20:
                t1.setText(r[19]);
                t2.setText(e[18]);
                t3.setText(e[6]);
                t4.setText(e[19]);
                break;

            default:
                t1.setText("");
        }

    }

    //Listener für Button 1
public void setButtonClickListener1(){
    b1 = (ImageButton) findViewById(R.id.imageButton2);
    b1.setOnClickListener(new View.OnClickListener(){
        public void onClick(View view){
            switch (MainActivity.random) {

                case 1:
                case 4:
                case 5:
                case 8:
                case 11:
                case 14:
                case 15:
                case 18:
                    MainActivity.korrekt = true;
                    break;
                default:
                    t1.setText("");
            }
            }
    });
}
//Listener für Button 2
    public void setButtonClickListener2(){
        b2 = (ImageButton) findViewById(R.id.imageButton);
        b2.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                switch(MainActivity.random){

                    case 2:
                    case 6:
                    case 9:
                    case 12:
                    case 16:
                    case 19:
                        MainActivity.korrekt = true;
                        break;
                    default:
                        t1.setText("");


                }
            }
        });
    }

    //Listener für Button 3
    public void setButtonClickListener3(){
        b3 = (ImageButton) findViewById(R.id.image_Button1);
        b3.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                switch (MainActivity.random) {

                    case 3:
                    case 7:
                    case 10:
                    case 13:
                    case 17:
                    case 20:
                        MainActivity.korrekt=true;
                        break;
                    default:
                        t1.setText("");

                }
            }
        });
    }


}
```


----------



## InfectedBytes (18. Jun 2016)

Erstmal: änder deine Variablennamen! t1 bis t4, imageButton1, imageButton2, image_button, e, r, .... das sind so ziemlich die schlimmsten Bezeichnungen die man hätte wählen können. Wie willst du dein eigenes Programm morgen noch verstehen, wenn sämtliche Variablen nichtssagend sind und wie willkürlich gewählt erscheinen?

wie glaubst du zu erkennen das nur der erste button funktioniert?
In allen Listenern setzt du _korrekt _auf _true _setzt den Text von _t1 _auf "". 
ergo machen deine Listener quasi alle das gleiche. Kann es vielleicht sein das du eigentlich den text von den anderen textboxen auf "" setzen willst und nicht immer nur von t1 ?


----------



## Til7373 (19. Jun 2016)

T ist Textfeld und b ist button r ist Rechnung und e Ergebnis ich find das nicht sehr kompliziert aber dadrum gehts ja nicht.
Das Problem ist dass wenn das Ergebnis auf button1 steht dann passiert nichts und wenn das Flasche Ergebnis auf button 1  steht wird das Textfeld(t1) leer.
Wenn jetzt aber der button2 das falsche Ergebnis enthält und ich klicke dann passiert nichts obwohl eigentlich das Textfeld leern werden sollte.


----------



## AndiE (19. Jun 2016)

Gut. Er wird das Textfeld aber erst neu als leer anzeigen, wenn du die alte Ansicht ungültig erklärt hast, denn dann wird neu gezeichnet.


----------



## Til7373 (19. Jun 2016)

Ja das stimmt aber auch wenn ich als erstes auf den 2. Button oder 3. klicke passiert nichts.
Es ist wirklich ein Problem mit den listeners aber ich seh kein Unterschied zwischen dem ersten und den anderen listener


----------



## SeriousD0nkey (20. Jun 2016)

Hast du das ganze mal im Debugger ausprobiert, ob er nicht vielleicht doch in den Listener reinspringt? Vielleicht hast du einen Logikfehler und denkst nur, dass nichts passiert? 
Was mir ansonsten aufgefallen ist, dass du b1 (steht ja wohl für Button1?) den Button mit der Nummer 2 zuweist während du b2 den Button ohne eine Zahl zuweist? Und b3 bekommt den Button mit der 1. Das ist ziemlich verwirrend und solltest du ändern (vielleicht liegt hier ja sogar das Problem?).


----------



## Til7373 (23. Jun 2016)

hallo,
danke für eure Hilfe.
Ich habe den Fehler gefunden!
Es lag dadran dass ich ja textfelder auf den Buttons hatte.zwei von den dreien(bei button2 und 3)
hab ich in xml irgendwie als clickable true gesetzt wodurch das Programm anscheinend nicht in die Listener gegangen ist.
Ich hätte jetzt noch eine Frage bezüglich verschiedenen Activities in Android und zwar will ich eine Activity(Start) starten wenn man falsch getippt hat.
ich hab das erstmal so gemacht:

```
// erst ein Intent
Start = new Intent(MainActivity.this,Start.class);
//und dann soll damit versucht werden eine variable an //die andere Activity zu senden und sie zu starten

Start.putExtra(Intent.EXTRA_TEXT,Punktestand);
                                startActivity(Start);
```


Leider bekomm ich eine Fehlermeldung dass es die Activity Start nicht findet und ob ich sie in dem Manifest registriert habe.
Das habe ich eigentlich schon:

```
<activity
            android:name=".Start"
            android:label="@string/Falsch"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.andriod.tiljo.mathfix.Start" />
        </activity>
```


----------

