Textfield auf Inhalt abfragen - Stürzt ohne Fehlermeldung ab :(

Status
Dieses Thema wurde gelöst! Zur Lösung springen…
S

shareking

Neues Mitglied
1
Hallo Zusammen,

ich stehe vor einem neuen Problem ich habe in Android zwei Textfelder und ein Button eingebunden (Aussehen ist nebensächlich gerade :), also nicht wundern :D ). Jetzt gebe ich dort jeweils 2 Werte ein und drücke auf Button "Rechnen". Android Studios sieht keinen Fehler, jedoch stürzt die App beim drücken des Buttons ab und ich weiß nicht wo der Fehler ist :(

MainActivity.java

Java:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onClick(View v) {
        int zahl1;
        int zahl2;
        int Ergebnis;


        EditText wert1 = (EditText)findViewById(R.id.zahl1);
        EditText wert2 = (EditText)findViewById(R.id.zahl2);
        EditText feldErgebnis = (EditText)findViewById(R.id.etErgebnis);


        if(wert1.getText().toString().length() == 0) {
            return;
        }
        if(wert2.getText().toString().length() == 0) {
            return;
        }
        zahl1 = Integer.parseInt(wert1.getText().toString());
        zahl2 = Integer.parseInt(wert2.getText().toString());
        Ergebnis = zahl1 + zahl2;


        feldErgebnis.setText(String.valueOf(Ergebnis));
    }
}

activity_main.xml

XML:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context=".MainActivity">


    <EditText
        android:id="@+id/zahl2"
        android:layout_width="338dp"
        android:layout_height="0dp"
        android:layout_marginTop="302dp"
        android:layout_marginBottom="39dp"
        android:ems="10"
        android:gravity="center"
        android:inputType="numberDecimal"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        app:layout_constraintBottom_toTopOf="@+id/btn_rechnen"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.41"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_rechnen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="280dp"
        android:layout_marginEnd="62dp"
        android:layout_marginBottom="297dp"
        android:onClick="buttonClick"
        android:text="Rechnen"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/zahl2" />

    <EditText
        android:id="@+id/zahl1"
        android:layout_width="0dp"
        android:layout_height="60dp"
        android:layout_marginStart="37dp"
        android:layout_marginTop="216dp"
        android:layout_marginEnd="32dp"
        android:ems="10"
        android:gravity="center"
        android:inputType="number"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        app:layout_constraintBottom_toTopOf="@+id/zahl2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

    <EditText
        android:id="@+id/etErgebnis"
        android:layout_width="159dp"
        android:layout_height="66dp"
        android:layout_marginTop="20dp"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.174"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/zahl2"
        app:layout_constraintVertical_bias="0.248" />


</androidx.constraintlayout.widget.ConstraintLayout>
 
Zuletzt bearbeitet:
Empfohlene Antwort(en)
wie wäre es mit einen "nicht Null" "!= 0"

aber wenn du deine abfrage nachbeiden Variablen am anfang machst sollte das gehn. da hast du doch das Und schon.
Und wenn beide null sind kannst du duch return die methote beenden .
sind sie es nicht prüfst du weiter.
Beiträge automatisch zusammengeführt:

Code:
if(wert2.getText().toString().length() == 0 && wert1.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Beide Felder sind leer ", Toast.LENGTH_SHORT).show();
            return;
} else if{wert1.getText().toString().length() == 0){
            Toast.makeText(getApplicationContext(), "Erste Feld leer ", Toast.LENGTH_SHORT).show();
            return;
} else if(wert2.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Beide Felder sind leer ", Toast.LENGTH_SHORT).show();
            return;
    
}
Beiträge automatisch zusammengeführt:

public void buttonClick(View v)
void = kein rückgabe Wert bei einen einfachen Return ohne Wert wird die methode verlaassen an der stelle wo du gerade bist.
genau das willst du ja auch denn du möchst nicht das geparst und rechnet wird.
 
Zuletzt bearbeitet:
Alle Antworten (15)
Hallo gibst du auch eine Zahl ein oder auch Text?
Text kann nicht gesparst werden.
Das würde ich in einen try catch block backen und die Fehlermeldung abfangen.

Übrigens welche Fehler Meldung kommt den im log?

Sind auch beide text Felder ausgefüllt?
Beiträge automatisch zusammengeführt:

Für die Ausgabe würde ich auch kein EditText nehmen sondern nur eine einfache textview.
 
Zuletzt bearbeitet:
Hi, also ich habe das so gelöst, das man erst garkeine Texte eingeben kann sondern nur zahlen. In der XML Datei steht dann
android:inputType="numberDecimal". Ziel soll es sein, abzufragen, ob in jedem Feld ein eine Zahl eingetragen wurde oder nicht. Wenn nicht, sollte ein Toast ausgegeben werden, das da noch was eingetragen werden muss.
 
Hallo
Ich habe es leider erst jetzt gesehen. Der Grund das die App abstürzt ist das du in dem Layout die Klick Methode
„buttonClick“ nennst. In der Activity hast du die rar nicht. Dort heißt sie „onClick(View v)“.
Ändere das in der Activity in „public void buttonClick(View v)“.
 
Zuletzt bearbeitet:
Hey, vielen Dank. Wie peinlich. :( Ich hatte es zuerst mit OnClickListener gemacht, wahrscheinlich deshalb noch das OnClick drin.
Ich habe da gleich eine weitere Frage. Ich wollte nun über ein Toast ausgeben das wenn ein Feld leer ist, das ein Toast ausgegeben wird. ich habe da zwar einen Ansatz aber wenn beide Felder leer sind, gibt er mir dennoch nur die erste If abfrage als Toast aus.
Java:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void buttonClick(View v) {
        int zahl1;
        int zahl2;
        int Ergebnis;


        EditText wert1 = (EditText)findViewById(R.id.zahl1);
        EditText wert2 = (EditText)findViewById(R.id.zahl2);
        EditText feldErgebnis = (EditText)findViewById(R.id.etErgebnis);


        if(wert1.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Erste Feld leer ", Toast.LENGTH_SHORT).show();
            return;
        }else if (wert2.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Zweite Feld leer ", Toast.LENGTH_SHORT).show();
            return;
        }else if(wert2.getText().toString().length() == 0 && wert1.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Beide Felder sind leer ", Toast.LENGTH_SHORT).show();
            return;
        }
        zahl1 = Integer.parseInt(wert1.getText().toString());
        zahl2 = Integer.parseInt(wert2.getText().toString());
        Ergebnis = zahl1 + zahl2;


        feldErgebnis.setText(String.valueOf(Ergebnis));
        System.out.println(Ergebnis);
    }
}


Ich vermute das es daran liegt, das die erste Bedingung zutrifft und er deshalb sagt, ja das passt gibt diesen Toast an. Aber wie Frage ich denn ab ob da was drin ist? Gibt es vielleicht eine bessere Variante sowas abzufragen? Ich hatte mal irgendwas von .equals gelesen, aber so wirklich verstanden habe ich es nicht :(
 
Eigentlich logisch nach dem ersten If und dem ersten Toast machst du return und bist raus aus der Klicklistner Methode.
Der nachfolgende Code wird nicht mehr ausgefürt.
Die Methode wird erst beim neuen Button Kick wider aufgerufen und begint von vorm.
 
Zuletzt bearbeitet:
aber nehme ich "return" aus, habe ich ja kein Rückgabe Wert oder verstehe ich grad was falsch?
 
sinnvoler ist es die Abfrage nach beiden werten zuerst zu machen und dann return.
 
Das Problem, ich Frage ja nach length == 0 ab, wie wäre dann die andere Variante zufragen, ob da was drin ist? Dann kann ich die IF abfrage durch && doppelt abfragen oder nicht? P.S. kann deinem Ansatz mit return nicht ganz folgen
 
ja du versteht was falsch
erstens hat die Methode keinen rückgabe Wert. Machst ja nur das Return damit die Methdote vorzeitig beendet wird.
Und wenn das erste Return kommt ist sie beendet.
 
Kannst du das an meinem Code vllt erklären?
 
Hi genau auf das mit !=0 bin ich überhaupt nicht gekommen. Habe es nun so gelöst:

Java:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void buttonClick(View v) {
        int zahl1;
        int zahl2;
        int Ergebnis;


        EditText wert1 = (EditText)findViewById(R.id.zahl1);
        EditText wert2 = (EditText)findViewById(R.id.zahl2);
        EditText feldErgebnis = (EditText)findViewById(R.id.etErgebnis);


        if(wert1.getText().toString().length() == 0 && wert2.getText().toString().length() != 0) {
            Toast.makeText(getApplicationContext(), "Erste Feld leer ", Toast.LENGTH_SHORT).show();
            return;
        }
        else if(wert2.getText().toString().length() == 0 && wert1.getText().toString().length() != 0) {
            Toast.makeText(getApplicationContext(), "Zweite Feld leer ", Toast.LENGTH_SHORT).show();
            return;
        }
        else if(wert2.getText().toString().length() == 0 && wert1.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Beide Fehlder sind leer ", Toast.LENGTH_SHORT).show();
            return;
        }
        zahl1 = Integer.parseInt(wert1.getText().toString());
        zahl2 = Integer.parseInt(wert2.getText().toString());
        Ergebnis = zahl1 + zahl2;


        feldErgebnis.setText(String.valueOf(Ergebnis));
        System.out.println(Ergebnis);
    }
}

Habe "return" stehen lassen. Ist das so korrekt? oder was wäre "besser/ sauberer" als Lösung?
 
wie wäre es mit einen "nicht Null" "!= 0"

aber wenn du deine abfrage nachbeiden Variablen am anfang machst sollte das gehn. da hast du doch das Und schon.
Und wenn beide null sind kannst du duch return die methote beenden .
sind sie es nicht prüfst du weiter.
Beiträge automatisch zusammengeführt:

Code:
if(wert2.getText().toString().length() == 0 && wert1.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Beide Felder sind leer ", Toast.LENGTH_SHORT).show();
            return;
} else if{wert1.getText().toString().length() == 0){
            Toast.makeText(getApplicationContext(), "Erste Feld leer ", Toast.LENGTH_SHORT).show();
            return;
} else if(wert2.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(), "Beide Felder sind leer ", Toast.LENGTH_SHORT).show();
            return;
    
}
Beiträge automatisch zusammengeführt:

public void buttonClick(View v)
void = kein rückgabe Wert bei einen einfachen Return ohne Wert wird die methode verlaassen an der stelle wo du gerade bist.
genau das willst du ja auch denn du möchst nicht das geparst und rechnet wird.
 
Zuletzt bearbeitet:
D.h. ist müsse oben
public int buttonClick(View v) {

nehmen?
 
nein du willst und und brauchst keinen Rüchkabewert darfst auch keinen haben dann geht der Listner nicht mehr.

Ein "Return" ohne wert beendet einfach die Methode . Gibt nichts zurück einfach nur ende.
Beiträge automatisch zusammengeführt:

Schaue in den Grundlagen Java was return macht.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: shareking
Okay, danke dir für deine Mühe. Ich lese es mir noch einmal in Ruhe nach und versuche es zu verstehen.
 
Status
Dieses Thema wurde gelöst! Zur Lösung springen…

Ähnliche Themen

S
Antworten
8
Aufrufe
482
swa00
swa00
B
Antworten
3
Aufrufe
1.287
swa00
swa00
Zurück
Oben Unten