wie sollte der TextWatcher funktionieren?

  • Antworten:8
Volkan Aydin
  • Forum-Beiträge: 187

03.10.2014, 20:48:05 via Website

Im Grunde genommen sollte dies ja klar sein, jedoch irgendwo harzt es gewaltig.

Ich möchte den TextWatcher dazu nutzen, nach einer eingabe, also sobald etwas anderes ausgewählt wird, soll der tw die eingabe überprüfen, bei bedarf ein anderes Feld deaktivieren und den Speicher Button deaktivieren.

Ich habe gleich mehrere kleine Probleme.

  1. Das Hauptproblem, nach jede eingabe werden diese funktionien ausgelöst. sollte das nicht in den afterTextChanged rein?
  2. Manchmal deaktiviert es den Button, manchmal nicht, soll heissen wenn die Toastausgabe zu klein kommt, deaktiviert es den Button nicht, bei zu gross, funktioniert es.... ich habe keinen fehler gefunden. :(

Jetzt aber mal den Code...

private void onChangeListenerMinMax(final EditText et, final String fieldMin,final String fieldMax){    
db.open();
String dbName = "glas";
String where = "id = '"+sp.viewP("idSchleiferei")+"'";
final Cursor c = db.whileQuery(dbName, null, where, null, null, null);  
et.addTextChangedListener(new TextWatcher() {
@Override        
public void afterTextChanged(Editable s) {          
        Button de = (Button)findViewById(R.id.buttonId);
        if(fieldMin != null){
            if(!db.string(c, fieldMin).equals("0")){
                if(!et.getText().toString().equals("")){
        if(Integer.parseInt(et.getText().toString())<Integer.parseInt(db.string(c, fieldMin))){
            de.setEnabled(false);   
            Toast.makeText(getBaseContext(), R.string.toast_schleiferei_min,Toast.LENGTH_SHORT).show();

        }else{
            de.setEnabled(true);
        }
                }
            }
    }
    if(fieldMax != null){
        if(!db.string(c, fieldMax).equals("0")){
            if(!et.getText().toString().equals("")){
        if(Integer.parseInt(et.getText().toString())>Integer.parseInt(db.string(c,fieldMax))){
            Toast.makeText(getBaseContext(), R.string.toast_schleiferei_max,Toast.LENGTH_SHORT).show();
             de.setEnabled(false);          
        }else{
            de.setEnabled(true);
        }   
            }
        }
    }
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    public void onTextChanged(CharSequence s, int start, int before, int count) {}
 });

db.close();

}

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

03.10.2014, 21:38:01 via Website

Problem 2 wurde gelöst :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.10.2014, 21:41:32 via Website

Und was ist dabei das Problem?
Dan wird halt der Button deaktiviert und wieder aktiviert nach einer Eingabe, oder sehe ich da was falsch?
Im Code konnte ich keine Fehler festmachen. (Zudem irgendwie unstrukturiert und nicht wirklich übersichtlich)
Theoretisch könntest du aber auch den Textwatscher weglassen, und das ganze bei buttonclick überprüfen,
wenn halt was falsch ist, müsste dann ein Dialog oä. zu sehen sein.

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

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

03.10.2014, 21:52:01 via Website

Das Problem ist, das ich eine 3 stellige Zahl eingeben will, aber nach jeder eingabe also bereits bei der ersten zahl alle drei ausgelöst werden.. also
-afterTextChanged
-beforeTextChanged
-onTextChanged

Ich habe überall einen Toast eingebaut um das zu überprüfen.. jedesma wenn ich eine zahl eingebe, werden alle Toast abgerufen......

Spinnt hier etwa der emulator ??? Bisher war es immer ich :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.10.2014, 21:53:59 via Website

Ind die 3 Zeichen bzw. Zahlen immer fix?
Dann känntest du über die Textlänge und einer If die Ausführung deines Coes verhindern.
Aber es ist rotzdem komisch, dafür gibt es doch die 3 Events..

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

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

03.10.2014, 22:02:22 via Website

leider nicht, das problem ist, es sind 30 vreschiedene felder, diese werden über 6 verschiedene felder geprüft, und jedes Objekt hat ihre eigene min/max , min oder min+radius überprüfungen... diese bilden eigene gruppen und werden einzeln aufgerufen.

Wenn ich das jetzt per Button cklick alles überprüfen muss ob diese jetzt geladen sind gibt es ja fast unendlich viele if .... :) Ich ging davon aus das ies einfach so funktionieren würde, es sind immerhin schon 800 Zeilen :(

Also z.b.....

 private void maxradius(String string) {
    TextView tv = getTextView(getResources().getString(R.string.dbs_maxradius),0);
     EditText et = getEditNr("",R.id.maxradius);


     et = setBlockedTextViewWithHint(et,string);


    TvEtLayoutHorizontal(tv,et);


    }
private void minradius(String string) {
    TextView tv = getTextView(getResources().getString(R.string.dbs_minradius),0);
     EditText et = getEditNr("",R.id.minradius);

     et = setBlockedTextViewWithHint(et,string);


    TvEtLayoutHorizontal(tv,et);

    }
private void radius() {

    TextView tv = getTextView(getResources().getString(R.string.dbs_radius),0);
     EditText et = getEditNr("",R.id.radius);
     onChangeListenerMinMax(et, "mindurchmesser", "maxdurchmesser"); 
    TvEtLayoutHorizontal(tv,et);

    }
private void fdurchmesser(String string) {
    TextView tv = getTextView(getResources().getString(R.string.dbs_fdurchmesser),0);
     EditText et = getEditNr("",R.id.fdurchmesser);
     et = setBlockedTextViewWithHint(et,string);


    TvEtLayoutHorizontal(tv,et);

    }
private void maxdurchmesser(String string) {
    TextView tv = getTextView(getResources().getString(R.string.dbs_maxdurchmesser),0);
     EditText et = getEditNr("",R.id.maxdurchmesser);

     et = setBlockedTextViewWithHint(et,string);

    TvEtLayoutHorizontal(tv,et);

    }
private void mindurchmesser(String string) {
    TextView tv = getTextView(getResources().getString(R.string.dbs_mindurchmesser),0);
     EditText et = getEditNr("",R.id.mindurchmesser);
     et = setBlockedTextViewWithHint(et,string);

    TvEtLayoutHorizontal(tv,et);

    }
private void durchmesser() {
    TextView tv = getTextView(getResources().getString(R.string.dbs_durchmesser),0);
     EditText et = getEditNr("",R.id.durchmesser);
     onChangeListenerMinMax(et, "mindurchmesser", "maxdurchmesser");
     TvEtLayoutHorizontal(tv,et);                           }
private void abstand_links_u() {

    TextView tv = getTextView(getResources().getString(R.string.dbs_abstand_links_u),0);
     EditText et = getEditNr("",R.id.abstand_links_u);
     onChangeListenerMin(et, "min_seiten_abstand");
     TvEtLayoutHorizontal(tv,et);       
    }

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

03.10.2014, 22:34:50 via Website

ich habe es "versucht" zu verstehen... :) jeenfalls hat mir dies keine lösung gebracht.... der fragesteller verwendet aber überall das @override? habe ich auch versucht, ist diese überhaupt nötig?....

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.10.2014, 22:39:22 via Website

Jup die brauchst du denn:

It's an annotation that you can use to tell the compiler and your IDE
that you intend the method that has that annotation to be an override
of a super class method. They have warning/errors in case you make
mistakes, for example if you intend to override a method but misspell
it, if the annotation is there the IDE or the compiler will tell you
that it is not in fact overriding the super class method and thus you
can determine why and correct the misspelling.

This is all the more important for Android applications and activities
for example, where all of the calls will be based on the activity
lifecycle - and if you do not properly override the lifecycle methods
they will never get called by the framework. Everything will compile
fine, but your app will not work the way you intend it to. If you add
the annotation, you'll get an error.

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

Antworten