Mit TextWatcher mehrere editText Felder berechnen lassen

  • Antworten:8
  • Bentwortet
toto
  • Forum-Beiträge: 5

21.02.2019, 19:18:59 via Website

Guten Tag Liebe Gemeinde,

ich bin kompletter Frischling, sowohl in Forum als auch bei Android Studio. ( ich kann mir vorstellen das Ihr das nicht das erste mal Ließt ^^ ;))

Um mir die Arbeit zu erleichtern möchte ich mir eine kleine Kalkulation App bauen.
Ich habe mir mehrere editText Felder Horizontal gesetzt.
et_ gebindepreis (editText Kilogramm preis ) et_menge (edittext für die Menge ) und et_weeinzeln( wo dann der errechnete Wareneinsatz ausgegeben wird).
Diese Feld reihe geht quasi dann 10 mal nach unten weiter die Benennung bleibt die gleiche und sind lediglich durch nummeriert also et_gebindepreis 1, 2 usw.

nach langen basteln habe ich es für eine Reihe so halb hin bekommen. Der Wareneinsatz wird errechnet und aus gegeben.
Aber ich komme einfach nicht weiter und hoffe Ihr könnt helfen.

Punkt 1 Die App crasht, wenn Ich in dem EditorText feld et_menge die zahl raus lösche und eine andere schreiben möchte.

Punkt 2 der Wareneinsatz Aktualisiert sich nicht. wenn ich die zahl im Kilogramm preis ändere. dafür crasht sie nicht°°(yawn)

Punkt 3 diese Berechnung möchte ich natürlich auch für alle anderen feld reihen ausführen.... und genau da komme ich nicht so wirklich weiter.....

Vielleicht hat ja jemand von euch eine Idee, schon mal vielen Dank für eure Mühe und Geduld.


Mein Code ist angehangen

import android.app.Notification;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;

import android.view.Menu;
import android.view.View;
import android.widget.EditText;



public class Activity_aufschlagkostenleyout extends AppCompatActivity {

    double dblgebindepreis;
    double dblmenge;
    EditText dblpreisout;
    String strgebindepreis;
    String strmenge;
    EditText etgebindepreis;
    EditText etmenge;

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

        etgebindepreis = (EditText)findViewById(R.id.edt_gebindepreis);
        etmenge = (EditText)findViewById(R.id.edt_menge);

        dblpreisout = (EditText)findViewById(R.id.edt_weeinzeln);

        etmenge.addTextChangedListener(new TextWatcher(){
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                strgebindepreis = etgebindepreis.getText().toString();
                strmenge = etmenge.getText().toString();
                dblgebindepreis = Double.parseDouble(strgebindepreis);
                dblmenge = Double.parseDouble(strmenge);

                dblgebindepreis = Double.parseDouble(strgebindepreis);
                dblmenge = Double.parseDouble(strmenge);
                dblpreisout.setText("" + dblmenge*dblgebindepreis);
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }

    public void myBerechnen(View v){
        strgebindepreis = etgebindepreis.getText().toString();
        strmenge = etmenge.getText().toString();
        if (!TextUtils.isEmpty(strgebindepreis)) {
            dblgebindepreis = Double.parseDouble(strgebindepreis);
            if (!TextUtils.isEmpty(strmenge)) {
                  dblmenge = Double.parseDouble(strmenge);
            }
        }
    }

};

— geändert am 21.02.2019, 20:54:25 durch Moderator

Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

22.02.2019, 21:09:40 via Website

Hallo toto,

um das Ergebnis auch zurück zu setzen, musst du in deinem Listener prüfen, ob die Eingabestrings Leer sind, und wenn das der Fall ist, die TextView auf leeren Text setzen.

Für dein multi ButtonProblem:

Evtl ist es von Vorteil du lagerst deinen Listener etc. in eine eigene Klasse aus.
Diese bekommt dann immer die Felder der aktuellen Zeile übergeben:
https://stackoverflow.com/a/6172024/4975457

In der Activity musst du dann definieren, welche Felder zu welcher Zeile gehören und dann kannst du da drüber iterieren um nicht für alle Felder den selben Code schreiben zu müssen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
toto
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.02.2019, 21:38:56 via Website

Hallo Toto,

für den App Crash musst du mal die Exception (Rot in Logcat) posten.
Ich vermute aber, dass du im onTextChanged ein Double.parse versuchst ohne zu checken ob der Text leer ist.

Was meinst du mir dem Wareneinsatz? Hier kann ich kein Code finden...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

21.02.2019, 21:45:06 via Website

Hallo
Zu Punkt 1 verstehe ich nicht was du meinst bitte etwas genauer.

  1. Du hast einen listner auf die Menge aber nicht auf den Preis.

— geändert am 21.02.2019, 21:54:25

Hilfreich?
Kommentieren
toto
  • Forum-Beiträge: 5

21.02.2019, 21:58:15 via Website

Schön Guten Abend Ihr beiden!

Danke für eure Zeit :)

Also der Wareneinsatz errechnet sich aus (Menge * Kilogrammpreis)
das ist der Code hier : dblpreisout.setText("" + dblmenge*dblgebindepreis);

@ Jokel
Punkt 1 : wenn ich Emulator starte um im Textfeld "et_menge "und eine zahl eingebe z.b. 0,500 klappt alles beim ersten mal. aber wenn ich 0,500 wieder raus nehme und 1.000 drauß mache möchte als bsp. stürzt endweder App oder die Aktivity wahlweise ab... immer dann wenn ich den Text Leeren möchte.

Punkt 2 : ich habe etmenge.addTextChangedListener(new TextWatcher(){ wie kann ich den in den Code weitere Listener Hinzufügen das es geht ?

enter code here 

2019-02-21 21:48:39.922 18777-18777/herzog.digitalKitchendesign.kitchenkey E/AndroidRuntime: FATAL EXCEPTION: main
Process: herzog.digitalKitchendesign.kitchenkey, PID: 18777
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at herzog.digitalKitchendesign.kitchenkey.Activity_aufschlagkostenleyout$1.onTextChanged(Activity_aufschlagkostenleyout.java:48)
at android.widget.TextView.sendOnTextChanged(TextView.java:9754)
at android.widget.TextView.handleTextChanged(TextView.java:9851)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:12509)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1263)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:575)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:229)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:36)
at android.text.method.BaseKeyListener.backspaceOrForwardDelete(BaseKeyListener.java:370)
at android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:71)
at android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:479)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:148)
at android.widget.TextView.doKeyDown(TextView.java:7665)
at android.widget.TextView.onKeyDown(TextView.java:7442)
at android.view.KeyEvent.dispatch(KeyEvent.java:2692)
at android.view.View.dispatchKeyEvent(View.java:12450)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:428)
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1820)
at android.app.Activity.dispatchKeyEvent(Activity.java:3360)
at android.support.v4.app.SupportActivity.superDispatchKeyEvent(ComponentActivity.java:108)
at android.support.v4.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
at android.support.v4.app.SupportActivity.dispatchKeyEvent(ComponentActivity.java:126)
at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:535)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
at android.support.v7.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2533)
at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:342)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5037)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4905)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)
2019-02-21 21:48:39.923 18777-18777/herzog.digitalKitchendesign.kitchenkey E/AndroidRuntime: at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4203)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

22.02.2019, 10:11:04 via Website

Hallo deine Berechnung ist schon richtig. Bin nur etwas durcheinander gekommen da du für den EditText auch das sufix dbl benutzt. Dazu gleich eine Frage warum ein EditText zur Ausgabe würde ein TextView reichen.

Das deine App abstürze kommt daher das du ei endet listner auf die Menge hast und bei jeder Änderung auch wenn du nur eine Stelle änderst wir er ausgelöst somit auch dann wenn du nichts in dem editText hast .
Dann wird beim parsen ein Fehler geworfen
dblmenge = Double.parseDouble(strmenge);
Packe das in einen try catch block.

  1. Du hast einen listner auf dem EditText
    etmenge.addTextChangedListener.....

Wenn du auch auf den anderen Wert reagieren willst setze den gleichen listner auf den Preis.
Da mit du nicht den Code nochmal schreiben musst würde ich das in eine Methode zusammen fassen und die im listner aufrufen.

Hilfreich?
Pascal P.
Kommentieren
toto
  • Forum-Beiträge: 5

22.02.2019, 12:32:09 via Website

Ich hatte vorher ohne dbl und die Anzeige hat immer 0.0 angezeigt nach ewigen probieren habe ich es dann als double versucht und seit dem steht das richtige Ergebniss da. Wie müsste den der Code aussehen als try catch Block?... sollte ich dann für den etmenge.addTextChangedListener die etmenge raus nehmen und separat listen lassen zusammen mit preis oder wie funktioniert das ? Ich muss noch viel lernen merke ich gerade.

Hilfreich?
Kommentieren
toto
  • Forum-Beiträge: 5

22.02.2019, 15:04:40 via App

Ach und ja keine Ahnung habe edittext einfach direkt weiter verwendet...macht es einen Unterschied für die Performance ob man textview oder edittext nimmt?

Hilfreich?
Kommentieren
toto
  • Forum-Beiträge: 5

22.02.2019, 18:14:24 via Website

also denke mal das ich es hin bekommen habe mit try Catch Block und den erweiterten Listener funktioniert zumindest soweit... zumindest stürzt er nicht mehr ab. habe den editorText zum Textview konvertiert.....
was sich jetzt noch nicht zurück setzten lässt ist das Ausgabe Feld vom Wareneinsatz wenn ich den anderen feldern die zahlen raus lösche da bleibt immer das letzte Ergebnis stehen..

und die große frage wäre noch, wie wende ich das ganze auf 9 weitere editText reihen an reihen?
meine Recherchen ergaben bis her if oder els if...

enter code here

package herzog.digitalKitchendesign.kitchenkey;

import android.app.Notification;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;

import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.math.RoundingMode;
import java.util.regex.Pattern;

public class Activity_aufschlagkostenleyout extends AppCompatActivity {

double dblgebindepreis;
double dblmenge;
TextView dblpreisout;
String strgebindepreis;
String strmenge;
EditText etgebindepreis;
EditText etmenge;


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

    etgebindepreis=(EditText)findViewById(R.id.edt_gebindepreis);
    etmenge=(EditText)findViewById(R.id.edt_menge);

    dblpreisout= (TextView) findViewById(R.id.edt_weeinzeln);

    etgebindepreis.addTextChangedListener(onTextChangedListener());
    etmenge.addTextChangedListener(onTextChangedListener());


}

private TextWatcher onTextChangedListener(){
return new TextWatcher(){

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            try {
                strgebindepreis = etgebindepreis.getText().toString();
                strmenge = etmenge.getText().toString();
                dblgebindepreis = Double.parseDouble(strgebindepreis);
                dblmenge = Double.parseDouble(strmenge);

                dblgebindepreis = Double.parseDouble(strgebindepreis);
                dblmenge = Double.parseDouble(strmenge);
                dblpreisout.setText(""+ dblmenge * dblgebindepreis);
            } catch (Exception ex)
            {TextUtils.isEmpty(strmenge); }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };
}

public void myBerechnen(View v){
  strgebindepreis=etgebindepreis.getText().toString();
   strmenge=etmenge.getText().toString();
     if (!TextUtils.isEmpty(strgebindepreis)) {
         dblgebindepreis = Double.parseDouble(strgebindepreis);
         if (!TextUtils.isEmpty(strmenge)) {
              dblmenge= Double.parseDouble(strmenge);
}

}
}

};

— geändert am 22.02.2019, 19:43:04

Hilfreich?
Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

22.02.2019, 21:09:40 via Website

Hallo toto,

um das Ergebnis auch zurück zu setzen, musst du in deinem Listener prüfen, ob die Eingabestrings Leer sind, und wenn das der Fall ist, die TextView auf leeren Text setzen.

Für dein multi ButtonProblem:

Evtl ist es von Vorteil du lagerst deinen Listener etc. in eine eigene Klasse aus.
Diese bekommt dann immer die Felder der aktuellen Zeile übergeben:
https://stackoverflow.com/a/6172024/4975457

In der Activity musst du dann definieren, welche Felder zu welcher Zeile gehören und dann kannst du da drüber iterieren um nicht für alle Felder den selben Code schreiben zu müssen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
toto
Kommentieren