Android Edittext onTextChange endlosschleife

Besset

Mitglied
Guten Tag,

Ich habe Folgendes Problen:
Ich arbeite an einem Zahlensystem-Konvertierer (für binär, dezimal, octal und hexadezimal). Der benutzer gibt in einem edittext-feld eine passende nummer ein und in den anderen 3 edittextfeldern erscheinen dann die gleichbedeutenden zahlen.
allerdings landet das programm in einer endloschleife, wenn ein durch ein onTextChanged ein edittext bearbeitet Wird.
Wie mache ich eine Art stopper um dem programm zu sagen das es nur konvertieren soll wenn der buntzer das edittext-feld bearbeitet hat?


[CODE lang="java" title="Onchange Codeblock"]DEC.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) {
if(!isEmpty(DEC)) {
dezimal = DEC.getText().toString();
zwischen = cfrom("DEC", dezimal);
BIN.setText(cto(zwischen, "BIN"));
OCT.setText(cto(zwischen, "OCT"));
HEX.setText(cto(zwischen, "HEX"));
}
}

@Override
public void afterTextChanged(Editable s) {

}
});[/CODE]

(Der Code für Binär, Octal und hexadezimal sieht natürlich genauso aus)
 
K

kneitzel

Gast
Du hast mehrere Möglichkeiten:
a) Du schreibst eine Methode, die die Änderung durchführt. Diese deregistriert den Listener, führt die Änderung durch und registriert ihn danach wieder.
b) Du führst einfach ein Flag ein, das deinem Listener anzeigt, dass er bei der nächsten Änderung mal aussetzen sollte. Wenn das Flag gesetzt ist, wir der Handler es nur zurück setzen.

Also etwas wie:
Java:
            boolean automaticChange = false;

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (automaticChange) {
                    automaticChange = false;
                    return;
                }
                
                if(!isEmpty(DEC)) {
                    dezimal = DEC.getText().toString();
                    zwischen = cfrom("DEC", dezimal);
                    BIN.setText(cto(zwischen, "BIN"));
                    OCT.setText(cto(zwischen, "OCT"));
                    HEX.setText(cto(zwischen, "HEX"));
                }
            }
 

Besset

Mitglied
Du hast mehrere Möglichkeiten:
a) Du schreibst eine Methode, die die Änderung durchführt. Diese deregistriert den Listener, führt die Änderung durch und registriert ihn danach wieder.
b) Du führst einfach ein Flag ein, das deinem Listener anzeigt, dass er bei der nächsten Änderung mal aussetzen sollte. Wenn das Flag gesetzt ist, wir der Handler es nur zurück setzen.

Also etwas wie:
Java:
            boolean automaticChange = false;

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (automaticChange) {
                    automaticChange = false;
                    return;
                }
               
                if(!isEmpty(DEC)) {
                    dezimal = DEC.getText().toString();
                    zwischen = cfrom("DEC", dezimal);
                    BIN.setText(cto(zwischen, "BIN"));
                    OCT.setText(cto(zwischen, "OCT"));
                    HEX.setText(cto(zwischen, "HEX"));
                }
            }
Vielen Dank für deine Antwort

mit dem boolean hat dies leider nicht funktioniert, da immer 3 edittext bearbeitet werden. Ich weiß jetzt nicht wie ich das genau erklären soll, aber ich denke man versteht das problem.
aber du hast mich dadurch auf eine Idee gebracht anstat einen boolean nehme ich ein integer und setzte ihn anfangs auf 0. wenn sich ein feld ändert wird dieser um 1 reduziert, sofern er nich schon 0 ist. wenn er null ist wird er auf drei gesetzt und die anderen felder bearbeitet.
[CODE lang="java" title="Meine jetzige lösung"]int automaticChange = 0;

DEC.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) {
if (automaticChange != 0) {
automaticChange--;
return;
}
if(!isEmpty(DEC)) {
automaticChange = 3;
dezimal = DEC.getText().toString();
zwischen = cfrom("DEC", dezimal);
BIN.setText(cto(zwischen, "BIN"));
OCT.setText(cto(zwischen, "OCT"));
HEX.setText(cto(zwischen, "HEX"));
}
}

@Override
public void afterTextChanged(Editable s) {

}
});[/CODE]
 

Ähnliche Java Themen

Neue Themen


Oben