Listener erst beim zweiten Durchlauf

P

paulinchen

Gast
Hallo,

ich habe hier ein kleines Problem mit dem OnClickListener, zumindest glaube ich das es daran liegt.

In meinem Programm soll geprüft werden, ob im EditText "LaengeText" etwas eingegeben wurde und falls da was eingegeben wurde soll eine andere Berechnung durchgeführt werden, als wenn in dem Textfeld nichts verändert wurde.

Problem ist, das dieses besagte Feld manchmal das Ergebnisfeld und manchmal das Eingabefeld sein soll.

Klappt eigentlich auch, nur eben immer erst beim zweiten Mal den Berechnen Button drücken. Ich finde aber nicht raus wieso.

Code:
public class matcalc extends Activity {

    private Spinner sF;
    private Spinner sE;
    private EditText Erg;
    private int H;
    private int M;
    private double S;
    private double E;
    public int L;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        sF = (Spinner) findViewById(R.id.FormatSpinner);
        ArrayAdapter <?> adapter = ArrayAdapter.createFromResource(
                this, R.array.Formate, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sF.setAdapter(adapter);
        sE = (Spinner) findViewById(R.id.EinheitSpinner);
        ArrayAdapter <?> adapter2 = ArrayAdapter.createFromResource(
                this, R.array.Einheit, android.R.layout.simple_spinner_item);
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sE.setAdapter(adapter2);

        Erg = (EditText) findViewById (R.id.LaengeText);
        Erg.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (Erg.getText().toString().equals("")){
                    L = 0;}
                else{
                    L = 1;}
            }
        });
        
        Button btn = (Button) findViewById (R.id.Berechne);        
        btn.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 
                 sF.setOnItemSelectedListener(new FormatSpinnerListener());
                 sE.setOnItemSelectedListener(new EinheitSpinnerListener());

                        EditText HS = (EditText) findViewById (R.id.StundenText);
                        if (HS.getText().toString().equals("")){
                            H = 0;
                        }
                        else {
                            H = Integer.parseInt(HS.getText().toString());}
                        EditText MS = (EditText) findViewById (R.id.MinutenText);
                        if (MS.getText().toString().equals("")){
                            M = 0;
                        }
                        else {
                            M = Integer.parseInt(MS.getText().toString());}
                        EditText SS = (EditText) findViewById (R.id.SekundenText);
                        if (SS.getText().toString().equals("")){
                            S = 0;
                        }
                        else {
                            S = Double.parseDouble(SS.getText().toString());}
                        EditText FS = (EditText) findViewById (R.id.FramesText);
                        if (FS.getText().toString().equals("")){
                            FS.setText("24");
                        }
                        double F = Double.parseDouble(FS.getText().toString());
                        
                        if (L == 1){
                                E = Double.parseDouble(Erg.getText().toString());
                                E = E*FormatSpinnerListener.format/F;
                                E = E/EinheitSpinnerListener.einheit;
                                double Sd = E % 60;
                                double x = E/60;
                                double Md = x % 60;
                                double Hd = x/60;
                                Sd = Double.valueOf(Math.round(Sd*100.)/100.);
                                SS.setText(Double.toString(Sd));
                                MS.setText(Integer.toString((int)Md));
                                HS.setText(Integer.toString((int)Hd));
                                L = 0;
                        }
                        else{
                            E = 0;
                            H = H*60;
                            M = (M+H)*60;
                            E = (S+M)*EinheitSpinnerListener.einheit*F/FormatSpinnerListener.format;
                            E = Double.valueOf(Math.round(E*100.)/100.);
                            Erg.setText(Double.toString(E));}
             }

                    
        });
    }
}
Vielleicht hat ja auch jemand ne andere Idee wie man das lösen kann...
 
Niemand?

Ich glaub da hat sich irgendwo ein dummer Fehler eingeschlichen, den ich nicht finde...

Bitte kann mir jemand suchen helfen.
 
Wäre mal nett zu wissen was nicht funktioniert und was passiert...
 
Also ich habe da das Edittext Feld "Laengetext" und das ist zum einen das Ergebnisfeld, aber eben auch ein Eingabefeld. Wenn man da was eingibt wird die Rechnung rückwärts gerechnet.
Das funktioniert auch, nur eben immer erst beim zweitenmal drücken des Berechnen Buttons. Beim erstenmal wird das Feld immer mit dem Ergebnis aus den anderen Feldern überschrieben.
Ich hab um zu erkennen, in welche Richtung gerechnet wird einen Listener für das Feld eingebaut, der beobachtet ob in das Feld geklickt wurde. Aber das funktioniert leider nicht zuverlässig.
Hoffe das war jetzt einigermaßen verständlich.
 
Also so wie ich das nach schnellem überfliegen des Codes gesehen habe, passiert folgendes:

1) Du startest die App, dann gibts da die Textfelder.

2) Du klickst auf das Erg-Feld, um was einzugeben. Im Moment des Klicks wird L = 0 gesetzt, weil das Textfeld wohl leer ist. Wenn du danach etwas eingibst, wird L nicht mehr verändert, da kein Klick mehr stattfindet. L bleibt also auf 0.

3) Du klickst auf den Berechne-Button und es wird in der untersten IF-Abfrage geschaut, ob L == 1 ist, was es aber nicht ist. Daher wird der ELSE-Teil ausgeführt.

Aber wenn ich dich richtig verstanden habe, willst du, dass der obere Teil der IF-Abfrage ausgeführt wird, oder?
 
Zuletzt bearbeitet:
ja exakt, genau das ist das Problem.

Also muss ich doch das Feld erst überprüfen, nachdem ich die Eingabe gemacht habe. aber wie mach ich das?
Vor allem so, das der Listener checkt, ob die Eingabe vom User erfolgt ist oder als Ergebnis vom System eingefügt worden ist.
 
Bin ich blöd.
Kann ich mir nicht einfach die Abfrage ob das Textfeld leer ist sparen und einfach beim Klick L =1 setzen, da ja danach was eingegeben wird.
Probier ich gleich mal aus.

Wäre halt nur noch gut eine Abfangüberprüfung zu machen, falls im Feld nach dem Klick tatsächlich nichts eingetragen wird.
 
Gibt es nicht eine Methode die ausgeführt wird wenn der Benutzer etwas mit der Tastatur eingibt? Kann leider grad nicht nachschauen da ich unterwegs bin, aber ich glaube ich habe letztens eine Methode gesehen.

Edit: es gibt auf jeden Fall einen onKeyboardActionListener für eine Keyboardview, aber inwiefern man das für ein EditText verwenden kann weiss ich nicht.
 
Also ich hab das jetzt mit einem OnKeyListener probiert.
Funktioniert jetzt super, wenn ich im besagten Edittext was eingebe, allerdings berechnet er jetzt nicht mehr in die andere Richtung.

Code:
public class matcalc extends Activity {

    private Spinner sF;
    private Spinner sE;
    private EditText Erg;
    private int H;
    private int M;
    private double S;
    private double E;
    public boolean L = false;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        sF = (Spinner) findViewById(R.id.FormatSpinner);
        ArrayAdapter <?> adapter = ArrayAdapter.createFromResource(
                this, R.array.Formate, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sF.setAdapter(adapter);
        sE = (Spinner) findViewById(R.id.EinheitSpinner);
        ArrayAdapter <?> adapter2 = ArrayAdapter.createFromResource(
                this, R.array.Einheit, android.R.layout.simple_spinner_item);
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sE.setAdapter(adapter2);

        Erg = (EditText) findViewById (R.id.LaengeText);
        Erg.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (KeyEvent.FLAG_SOFT_KEYBOARD == keyCode)
                {
                    return L = true;
                }
                return L = false;
            }
        });
        
        Button btn = (Button) findViewById (R.id.Berechne);        
        btn.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 
                 sF.setOnItemSelectedListener(new FormatSpinnerListener());
                 sE.setOnItemSelectedListener(new EinheitSpinnerListener());

                        EditText HS = (EditText) findViewById (R.id.StundenText);
                        if (HS.getText().toString().equals("")){
                            H = 0;
                        }
                        else {
                            H = Integer.parseInt(HS.getText().toString());}
                        EditText MS = (EditText) findViewById (R.id.MinutenText);
                        if (MS.getText().toString().equals("")){
                            M = 0;
                        }
                        else {
                            M = Integer.parseInt(MS.getText().toString());}
                        EditText SS = (EditText) findViewById (R.id.SekundenText);
                        if (SS.getText().toString().equals("")){
                            S = 0;
                        }
                        else {
                            S = Double.parseDouble(SS.getText().toString());}
                        EditText FS = (EditText) findViewById (R.id.FramesText);
                        if (FS.getText().toString().equals("")){
                            FS.setText("24");
                        }
                        double F = Double.parseDouble(FS.getText().toString());
                        
                        if (L = true){
                                E = Double.parseDouble(Erg.getText().toString());
                                E = E*FormatSpinnerListener.format/F;
                                E = E/EinheitSpinnerListener.einheit;
                                double Sd = E % 60;
                                double x = E/60;
                                double Md = x % 60;
                                double Hd = x/60;
                                Sd = Double.valueOf(Math.round(Sd*100.)/100.);
                                SS.setText(Double.toString(Sd));
                                MS.setText(Integer.toString((int)Md));
                                HS.setText(Integer.toString((int)Hd));
                                L = false;
                        }
                        else{
                            E = 0;
                            H = H*60;
                            M = (M+H)*60;
                            E = (S+M)*EinheitSpinnerListener.einheit*F/FormatSpinnerListener.format;
                            E = Double.valueOf(Math.round(E*100.)/100.);
                            Erg.setText(Double.toString(E));}
             }

                    
        });
    }
}
 
paulinchen schrieb:
Also ich hab das jetzt mit einem OnKeyListener probiert.
Funktioniert jetzt super, wenn ich im besagten Edittext was eingebe, allerdings berechnet er jetzt nicht mehr in die andere Richtung.
Kein Wunder:
Code:
if (L = true){
 
Aber wenn L nicht wahr ist springt er doch in die else Bedingungen, oder?
 
= Variablen zuweisen
== Vergleichen :winki:
 
Ich bin auch ein Trottel :blink:
Das hab ich vor lauter Listener gar nicht gesehen...

Hab ich natürlich sofort geändert, allerdings wird jetzt die Eingabe in LaengeText überhaupt nicht mehr wahrgenommen.
 
Ja, liegt an dem LaengeText Listener... du willst, dass L true ist wenn der User was eingegeben hat. Und das es false ist wenn er nichts eingegeben hat. Die Variable wird aber false wenn etwas anderes als SOFT_KEY passiert.
 
Aber ist das denn nicht das Gleiche?

Wenn der User was eingibt benutzt er das Keyboard, also ist L = true.
Wenn er nix eingibt, benutzt er auch das Keyboard nicht, somit L = false.
 
Hab es hinbekommen mit einem TextChangeListener.

Ich dachte die ganze Zeit, der kommt da durcheinander, weil in das Feld ja auch automatisch was reingeschrieben wird.

Tut er aber nicht!

Schlauer Android
 
so geht dann von der Programmlogik nicht mehr richtig (ausser ich habe was übersehen)

Beim ersten Starten ist das Erg-Feld leer, und der Benutzer füllt die anderen Felder aus, damit nach dem Berechnen im Erg-Feld das Resultat steht. Soweit würde es ja noch funktionieren.
Wenn der Benutzer aber jetzt nochmals eine solche Berechnung machen will (so dass das Erg-Feld das Endresultat anzeigt), muss er ja das Erg-Feld wieder löschen, und dafür braucht er wiederum das Soft-Keyboard. Nach dem Löschen wäre das Textfeld wieder leer, aber die App meint, der Benutzer hätte etwas hineingeschrieben, weil L == true ist.

Würde es nicht reichen, einfach vor der Berechnung zu schauen, ob das Erg-Feld leer ist?
Wenn ja, berechne das Resultat aus den anderen Feldern und zeige es im Erg-Feld an.
Wenn nein, rechne rückwärts und zeige das Resultat in den anderen Feldern an.

Also eigentlich so, wie dus am Anfang geplant hast. Dann könntest du dir den ganzen Listener für das Erg-Feld sparen und einfach nur im Berechne-Listener schauen, ob das Erg-Feld leer ist oder nicht, und dann die richtige Berechnung ausführen.
 
Das Problem ist dann aber, dass das Ergebnisfeld immer vor einer neuen Berechnung manuell geleert werden muss und das wollte ich nicht, weil das nur ein unnötiger Klick für den User ist.

Aber wie gesagt mit dem Textwatcher funktioniert es einwandfrei.

Vielen Dank nochmal für die Unterstützung.
 
zu früh gefreut. :(

Jetzt "spinnt" der Spinner.

Er hat wohl irgendein Problem mit der OnItemSelected Methode.

Ich hab wie in Android Devs Hello-Spinner sowohl eine Array xml und eine extra Klasse angelegt.
In dieser Klasse habe will ich die momentane Position des Spinners abfragen und ihm dann entsprechend verschiedene Werte übergeben.
Eigentlich funktioniert das auch, aber leider nicht besonders zuverlässig.
Komischerweise scheint sich das Programm beim beenden den aktuellen Wert des Spinners zu merken und obwohl der Spinner bei einem erneuten Start dann auf Position 0 steht mit dem vorherigen Wert zu rechnen.

Gibt es da eine Möglichkeit beim beenden den Cache des Programms zu leeren und somit den Spinner wieder komplett auf null zusetzen oder den Spinner wenigstens die richtige Position anzeigen zu lassen?
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

S
  • Sempervivum
Antworten
2
Aufrufe
593
Sempervivum
S
U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
665
swa00
swa00
5
Antworten
22
Aufrufe
1.367
590239
5
Zurück
Oben Unten