Android TaschenRechner

Java xyrse123

Bekanntes Mitglied
Hallo,
ich wollte eine TaschenRechner App machen. Ich habe jetzt einige Buttons in XML definiert. Gibt es für die Buttons sowas wie getActionCommand() in Java?
Also das ich nicht für jeden Button einen onClick Listener brauche.
Schonmal Danke im Vorraus.
 

Java xyrse123

Bekanntes Mitglied
Habe jetzt folgendes probiert:
Java:
public void updateText(View v){       
        Button btn = (Button) findViewById(v.getId());
        btn.setOnClickListener( this);
        String text = btn.getText().toString();
        TextView textview = (TextView) findViewById(v.getId());
        textview.setText(text);
    }

@Override
    public void onClick(View v) {
       updateText(v);
}
Aber bei der TextView wird nichts hinzugefügt.
 

Robat

Top Contributor
Das Konstrukt macht auch recht wenig Sinn.
Der OnClickListener wird bei dir erst hinzugefügt, wenn die Methode updateText(..) aufgerufen wird. Die Methode wird aber erst aufgerufen wenn man auf einen Button clickt.

Hier mal anhand eines kleinen Beispielcodes gezeigt (Als Art Pseudocode zu sehen):

Java:
public class FooActivity extends AppCompatActivity implements View.OnClickListener {
    private Button fooBtn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         fooBtn = (Button) findViewById(R.id.fooBtnId);
         fooBtn.setOnClickListener(this);
    }

     @Override
      public void onClick(View v) {
           if(this.fooBtn == v.getId()) {
                   // foo button clicked..
           }
      }
}
 

Robat

Top Contributor
Das geht schon einfacher.
Sagen wir mal du hast die Buttons nach folgendem Schema benannt: button_0, button_1, button_2, .. könntest du dir ein Array für die Buttons machen:

Java:
Button[] button = new Button[N];
for (int i = 0; i < N; i++) {
   int id = getResources().getIdentifier("button_"+i, "id", getPackageName());
   button[i] = (Button) findViewById(id);
}

So könntest du immer über das Array iterieren um bspw den Buttons den OnClickListener zuzuweisen.
 

Java xyrse123

Bekanntes Mitglied
Ok, danke. Ich wollte jetzt in der MainActivity die ganzen Buttons erstellen usw. und in der Klasse TaschenRechner die Rechenlogik machen. Doch jetzt hängt sich die App im Emulator auf und dort steht: TaschenRechner has stopped. Woran liegt das?

Java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public static EditText TextFeld;

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

        Button b1= (Button) findViewById(R.id.button1); b1.setOnClickListener(this);      
        TextFeld = (EditText) findViewById(R.id.editText1);
        ...
        new TaschenRechner();

    }

    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.button1:  TextFeld.append("7");  break;           
            case R.id.button17: TextFeld.setText("");  break; // Enter, auf Stack
            case R.id.button18: TextFeld.setText("");  break; // Clear
        }
    }

    public static  EditText getTextFeld() { // TextFeld bekommen
        return TextFeld;
    }
   
}


public class TaschenRechner { // RechenLogik

     EditText TextFeld;
Stack<String> stack = new Stack<String>();
    public TaschenRechner() {

       
        TextFeld = MainActivity.getTextFeld();
        TextFeld.setText("Test");
    }

}
 
Zuletzt bearbeitet:

Robat

Top Contributor
Ich würde mal vermuten, dass es an deinem Konstrukt liegt wie du dir das Textfeld holst. (ist aber ohne genauen Stacktrace/Exception nur geraten)
Du erstellst in der onCreate(..) Methode doch eh eine Instanz deiner TaschenRechner-Klasse.
Dort kannst doch eine Instanz deiner MainActivity mitgeben, um auf das Textfeld zuzugreifen.
Über diese Instanz kannst du dann deine Methode getTextFeld() aufrufen.
 

Java xyrse123

Bekanntes Mitglied
Achso ich habe eben das falsche gepostet. Das in #6 funktioniert. Die TaschenRechner Klasse hat noch eine Methode rechne() die nach dem Klicken vom Enter Button ausgeführt wird:
Java:
 public void rechne() {
        String s = TextFeld.getText().toString();
        stack.push(s);
}

Dort bekomme ich dann diese Exception und die App stürtz ab:

Code:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
        at com.example.admin.taschenrechner.TaschenRechner.rechne(TaschenRechner.java:24) (Zeile 24 ist die mit dem String s= ...)
 

Java xyrse123

Bekanntes Mitglied
HAbe eigentlich nicht viel verändert:
Java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public static EditText TextFeld;
    TaschenRechner r = new TaschenRechner();

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

        Button b1= (Button) findViewById(R.id.button1); b1.setOnClickListener(this);
        ...
        TextFeld = (EditText) findViewById(R.id.editText1);


    }

    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.button1:  TextFeld.append("7");  break;
           ...
            case R.id.button17: TextFeld.setText(""); r.rechne(); break; // Enter, auf Stack
            case R.id.button18: TextFeld.setText("");   break; // Clear

        }
    }

    public static  EditText getTextFeld() {
        return TextFeld;
    }

}

public class TaschenRechner { // RechenLogik

    EditText TextFeld;
    Stack<String> stack = new Stack<String>();

    public TaschenRechner() {

        EditText TextFeld;
        Stack<String> stack = new Stack<String>();

            TextFeld = MainActivity.getTextFeld();

        }


  public void rechne() {
         String s = TextFeld.getText().toString();
         stack.push(s);
 }
}
 

Robat

Top Contributor
Prinzipiell ist es das gleiche Problem wie vorhin.
Wenn du deine Instanz der TaschenRechner erstellst musst du das aktuelle MainActivity Objekt übergeben um darüber den Getter für das Textfeld aufzurufen.
So wie du es jetzt hast wird dein Textfeld immer null sein.
 

Java xyrse123

Bekanntes Mitglied
Wenn du deine Instanz der TaschenRechner erstellst musst du das aktuelle MainActivity Objekt übergeben um darüber den Getter für das Textfeld aufzurufen.
So wie du es jetzt hast wird dein Textfeld immer null sein.

Verstehe ich nicht wirklich, kannst du vielleicht ein Beispiel geben?

Ich habe es jetzt so gelöst(jedenfalls kommt keine Fehlermeldung mehr):
Java:
public static String getTextvonTextFeld() {
    return TextFeld.getText().toString();
}

Aber das erscheint mir irgendwie nicht ganz sauber gelöst.
 
Zuletzt bearbeitet:

Robat

Top Contributor
Hier mal an deinem Beispiel kurz veranschaulicht.
Java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText textFeld;
    private TaschenRechner r ;

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

         ....
        this.textFeld = (EditText) findViewById(R.id.editText1);
        this.r = new TaschenRechner(this);

    }

    public void onClick(View v) {
        ...
    }

    public String getTextfeldText() {
        return TextFeld.getText().toString();
    }

}

public class TaschenRechner { // RechenLogik
    private MainActivity activity;

    public TaschenRechner(MainActivity activity) {
        this.acitivity = activity;
     }

  public void rechne() {
         String s = activity.getTextfeldText();
 }
}
 

Java xyrse123

Bekanntes Mitglied
Ein Problem habe ich noch bei der RechnenMethode:
Die rechnen() Methode wird aufgerufen wenn der Enter Button gedrückt wird. Wenn eine Zahl eingeben wurde soll sie auf den Stack gepusht werden und wenn das + Zeichen eingegeben wird( nach dem 2 Zahlen auf dem Stack sind) soll die Summe ausgegeben werden.

Java:
public void rechne() {
    String eingabe = activity.getTextvonTextFeld();

    try {
        double zahl = Double.parseDouble(eingabe);
        stack.push(zahl);
     // activity.setTextFeldText(stack.peek().toString); kann ich mir anzeigen lassen
} catch (NumberFormatException e) {
    
    
        if (eingabe.equals("+") ){
            double zahl1=stack.pop();
            double zahl2=stack.pop();
            stack.push(zahl1+zahl2);
            zahl2=zahl1+zahl2;
            stack.push(zahl2);
            String tmp = Double.toString(zahl2);
            activity.setTextFeldText(tmp);
        }
    }
}
Aber nach dem ich + eingeben habe bekomme ich eine EmptyStack Exception obwohl der Stack ja eigentlich gar nicht leer sein kann.
 

Robat

Top Contributor
Hmm also am Code seh ich jetzt eigentlich kein Problem. Interessant wäre vielleicht noch mal dein gesamter Code aus der Logik-Klasse.
 

Java xyrse123

Bekanntes Mitglied
Das ist ja der gesamte Code aus der Logik-Klasse.

Ich habe jetzt folgendes probiert:
Z.B wenn ich das eingebe : 3.4.+ kommt als Ergebnis 7, was auch funktioniert.
Java:
public void rechne() {
    String text =activity.getTextvonTextFeld();
    for (String zeichen : text.split("\\.")) {
        switch (zeichen) {
            case "+":
                stack.push(stack.pop() + stack.pop());
                break;
            default:
                stack.push(Double.parseDouble(zeichen));
                break;
               }
            }
          activity.setTextFeldText("");
          activity.setTextFeldText(stack.peek().toString());
           }

Aber ich möchte, dass man eine Zahl eingibt, Enter drückt und die Zahl verschwindet und auf den Stack kommt.
Hier kommt jetzt wieder eine EmptyStackException :(:
Java:
public void rechne() {
    String text =activity.getTextvonTextFeld();
  
        switch (text) {
            case "+":
                stack.push(stack.pop() + stack.pop());
                activity.setTextFeldText(stack.peek().toString());
                break;
            default:
                stack.push(Double.parseDouble(text));
                break;
               }        
           }

Und in der onClick(): case R.id.button17: r.rechne(); TextFeld.setText(""); break; // Enter, auf Stack
 

Robat

Top Contributor
Ehrlich gesagt durchblick ich deine Herangehensweise noch nicht so richtig.
Du hast ein Edittext und einen Button ("Enter").

Der Nutzer soll folgendes machen:
Zahl eingeben -> Enter -> Zahl auf Stack pushen
Zahl eingeben -> Enter -> Zahl auf Stack pushen
'+' eingeben -> Enter -> Ergebnis ausrechnen.

Hab ich das soweit richtig verstanden?
 

Java xyrse123

Bekanntes Mitglied
Vielleicht war es etwas verwirrend: 1. CodeBeispiel in # 16 ich gebe 4.3.+ ein und dann ENTER, es wird an den Punkte gesplittet und als Ergebnis kommt 7.0 in TextFeld.

2. CodeBeispiel: ich gebe 2 ein -> ENTER, 3->ENTER und + -> ENTER( so wollte ich es haben) , bekoome dann aber eine Empty StackException und die App stürzt ab.
 
Zuletzt bearbeitet:

Robat

Top Contributor
Also anhand deines gezeigten Codes kann ich mir den Fehler nicht erklären.
Ich könnte mir noch vorstellen, dass du die Logik-Instanz falsch erstellst und daher immer ein neuer Stack erstellt wird..

Hier mal ein funktionierendes Beispiel damit wir uns nicht mehr ewig im Kreis drehen :p

Java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText edittext;
    private Button button;
    private Logic logic;

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

        this.edittext = findViewById(R.id.editText);
        this.button = findViewById(R.id.button);
        this.button.setOnClickListener(this);

        this.logic = new Logic(this);
    }

    @Override
    public void onClick(View view) {
        logic.calculate();
    }

    public String getText() {
        return edittext.getText().toString();
    }

    public void setText(String text) {
        this.edittext.setText(text);
    }

    public void clear() {
        edittext.setText("");
    }
}

Java:
public class Logic {
        private final MainActivity mainActivity;
        private final Stack<Double> stack;

        public Logic(final MainActivity mainActivity) {
            this.stack = new Stack<>();
            this.mainActivity = mainActivity;
        }

        public void calculate() {
            final String input = mainActivity.getText();

            switch(input) {
                case "+":
                    stack.push(stack.pop() + stack.pop());
                    mainActivity.clear();
                    mainActivity.setText("Ergebnis: " + stack.pop());
                    break;
                default:
                    stack.push(Double.parseDouble(input));
                    mainActivity.clear();
                    break;
            }
        }
    }
 

Java xyrse123

Bekanntes Mitglied
Danke für die Mühe, ich habe den Fehler jetzt auch selbst gefunden.
In der onClick() Methode habe ich immer einen neuen TaschenRechner erzeugt.
Das war echt ein dämlicher Fehler:(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Android Taschenrechner Android & Cross-Platform Mobile Apps 5
J Benachrichtigung Freigabe ab Android 14 Android & Cross-Platform Mobile Apps 1
J Android Benachrichtigung zum Zeitpunkt ers Android & Cross-Platform Mobile Apps 15
J Das Beispiel von Android erzeugt Fehler Android & Cross-Platform Mobile Apps 8
J Zeitdifferenzen unter Android 7 (API < 26) berechnen Android & Cross-Platform Mobile Apps 4
W Netzwerk Verbindungen Java Android Android & Cross-Platform Mobile Apps 107
Z Android IntelliJ Android & Cross-Platform Mobile Apps 2
M Repository bei Room-Database in Android Studio (Java) Android & Cross-Platform Mobile Apps 2
Android App auf das eigene Handy bekommen Android & Cross-Platform Mobile Apps 3
Alex IV Android App erstellen Android & Cross-Platform Mobile Apps 3
OnDemand CrossPlatform Kotlin iOs/Android Datenverbrauch Android & Cross-Platform Mobile Apps 2
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
wladp Android Studio Room Database Android & Cross-Platform Mobile Apps 1
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
N Android game programmieren Android & Cross-Platform Mobile Apps 5
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
K BLE Komunikation mit Android studio und esp32 Android & Cross-Platform Mobile Apps 5
G Android UDP Kommunikation Android & Cross-Platform Mobile Apps 1
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
T Android Android Augmented Faces in Java. Neue Landmarks erstellen Android & Cross-Platform Mobile Apps 1
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
J Is Android Development Head First Outdated? Android & Cross-Platform Mobile Apps 3
J Android Android Datenbankverbindung zum Raspberry Pi Android & Cross-Platform Mobile Apps 1
lolcore Android Studio -Download Documentation for Android SDK Android & Cross-Platform Mobile Apps 0
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
W Problem mit Android Studio Android & Cross-Platform Mobile Apps 0
W App Abo Android Android & Cross-Platform Mobile Apps 10
OSchriever Android Android MediaPlayer bei Anruf stoppen/pausieren Android & Cross-Platform Mobile Apps 2
OSchriever Auf onClick-Listener reagieren und Parameter übergeben (Android Studio) Android & Cross-Platform Mobile Apps 4
W removeNetwork Android App mit Spendenaktion fürs Tierheim! Android & Cross-Platform Mobile Apps 1
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
P undefinierbarer Fehler Android Android & Cross-Platform Mobile Apps 8
T Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie? Android & Cross-Platform Mobile Apps 10
W Variable überschreiben (Android Studio) Android & Cross-Platform Mobile Apps 2
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
ruutaiokwu Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android Wo das 'android.useAndroidX' property hinzufügen? Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
P Login und Registrierung Android Anzeige Android & Cross-Platform Mobile Apps 7
S Von JavaFx zu Android Android & Cross-Platform Mobile Apps 12
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
ruutaiokwu Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
M Komponenten positionieren in Android Studio 3.6.3 Android & Cross-Platform Mobile Apps 1
M Android Studio - Property-Fenster einblenden Android & Cross-Platform Mobile Apps 1
M Android Studio - App auf dem Smartphone testen Android & Cross-Platform Mobile Apps 7
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
M Android Studio - Configuration fehlt Android & Cross-Platform Mobile Apps 20
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
M Unsupported class file major version 57 - Fehlermeldung bei Android Studio Android & Cross-Platform Mobile Apps 27
ruutaiokwu Android Studio (SDK) ANDROID_SDK_ROOT-Variable? Android & Cross-Platform Mobile Apps 5
O Web API in Android (JAVA) einbinden Android & Cross-Platform Mobile Apps 3
J Android Studio macht seltsame Sachen Android & Cross-Platform Mobile Apps 2
J Android 9.1 aber android Studio findet API22 Android & Cross-Platform Mobile Apps 0
Dimax Web-Seite in native app convertieren mit Android Studio Android & Cross-Platform Mobile Apps 8
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
lolcore android studio: fehler bei laden des emulators Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
A Android-Studio: 2. Layout nach kurzer Zeit aufzeigen Android & Cross-Platform Mobile Apps 2
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
J Was soll das bedeuten ? does not require android.permission.BIND_JOB_SERVICE permission Android & Cross-Platform Mobile Apps 7
A Android Studio: ImageView verpixelt Android & Cross-Platform Mobile Apps 2
J intend Service im Android Studio Android & Cross-Platform Mobile Apps 4
L Android Android Development eventuell mit Flutter Android & Cross-Platform Mobile Apps 1
S Android Layout - welchen Typ? Android & Cross-Platform Mobile Apps 3
T Fehler Android Studio: java.net.MalformedURLException: no protocol: http%3A%2F%2Fwww.mal ..... Android & Cross-Platform Mobile Apps 2
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
A Android Studio - App mit Nearby Android & Cross-Platform Mobile Apps 1
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
N Android Game Background Service Android & Cross-Platform Mobile Apps 11
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
J Android Snake Android & Cross-Platform Mobile Apps 15
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
C Android Programmierung speziell oder einfach Java Buch kaufen? Android & Cross-Platform Mobile Apps 3
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
A Beginnen mit Serverkommunikatsion in Android Studio Android & Cross-Platform Mobile Apps 6
E Android Studio Android & Cross-Platform Mobile Apps 15
L Android Android Studio Setup killt Explorer Android & Cross-Platform Mobile Apps 3
K Android Videos rendern Android & Cross-Platform Mobile Apps 1
J Variable in strings.xml (Android Studio) Android & Cross-Platform Mobile Apps 0
B Android Android Studio lässt PC abstürzen Android & Cross-Platform Mobile Apps 3
B Android App Fehler Android & Cross-Platform Mobile Apps 21
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
G Android Push Notification Android & Cross-Platform Mobile Apps 2
Light Lux Fehlermeldung unter Android Studio Android & Cross-Platform Mobile Apps 1
D Android Android Apps direkt vom Handy aus programmieren? Android & Cross-Platform Mobile Apps 2
L Android Android Kalendar Tag Ansicht Android & Cross-Platform Mobile Apps 1

Ähnliche Java Themen

Neue Themen


Oben