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

  • 15 Antworten
  • Neuester Beitrag
Diskutiere Textfield auf Inhalt abfragen - Stürzt ohne Fehlermeldung ab :( im Android App Entwicklung im Bereich Android OS.
S

shareking

Neues Mitglied
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)
J

jogimuc

Stammgast
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.
Beitrag automatisch zusammengefügt:

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;
    
}
Beitrag automatisch zusammengefügt:

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)
J

jogimuc

Stammgast
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?
Beitrag automatisch zusammengefügt:

Für die Ausgabe würde ich auch kein EditText nehmen sondern nur eine einfache textview.
 
Zuletzt bearbeitet:
S

shareking

Neues Mitglied
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.
 
J

jogimuc

Stammgast
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:
S

shareking

Neues Mitglied
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 :(
 
J

jogimuc

Stammgast
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:
S

shareking

Neues Mitglied
aber nehme ich "return" aus, habe ich ja kein Rückgabe Wert oder verstehe ich grad was falsch?
 
J

jogimuc

Stammgast
sinnvoler ist es die Abfrage nach beiden werten zuerst zu machen und dann return.
 
S

shareking

Neues Mitglied
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
 
J

jogimuc

Stammgast
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.
 
S

shareking

Neues Mitglied
Kannst du das an meinem Code vllt erklären?
 
S

shareking

Neues Mitglied
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?
 
J

jogimuc

Stammgast
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.
Beitrag automatisch zusammengefügt:

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;
    
}
Beitrag automatisch zusammengefügt:

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:
S

shareking

Neues Mitglied
D.h. ist müsse oben
public int buttonClick(View v) {

nehmen?
 
J

jogimuc

Stammgast
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.
Beitrag automatisch zusammengefügt:

Schaue in den Grundlagen Java was return macht.
 
Zuletzt bearbeitet:
S

shareking

Neues Mitglied
Okay, danke dir für deine Mühe. Ich lese es mir noch einmal in Ruhe nach und versuche es zu verstehen.