editText durch zwei Textwatcher untersuchen lassen

  • Hallo und guten Tag zusammen,



    ich bin am Verzweifeln.
    Meine App soll folgendes können:
    Es existiert eine Tabelle, die sich automatisch erweitert, sobald jemand etwas eintippt
    Das funktioniert auch für jede Spalte und meiner Meinung nach ganz gut
    jetzt will ich aber, dass die Spalten 3 und 4 bzw. die Zellen darin
    überprüft werden. Es handelt sich um Zellen zur Zeiteingabe, und ich
    will natürlich verhindern, dass z.B. 13:85 Uhr eingegeben werden kann.
    Ich sitze nun schon zwei Tage davor, kann aber keine Lösung finden



    Es gibt noch ein paar andere Probleme (z.B. dass die neuen Reihen höher
    sind als die Ursprungsreihe), aber dieses ist mein dringlichstes



    Ein Bild der App im Anhang
    Und hier die Codes
    https://gist.github.com/anonym…f60bfcd8b27144ba40106342d
    https://gist.github.com/anonym…01c6e05ef439e1d0a816ee989
    https://gist.github.com/anonym…df56214652cd2f0e5ce2d4ba2



    Ich bitte inständigst um eure Hilfe, weil ich einfach nicht weiter komme



    MFG



    DerDon

  • hallo, ich würde das etwas anders machen für die Anzeige würde ich eine listview besser eine custen listview benutzen.
    Die Daten wurde ich in eine sqlite speichern.


    Was ist newRowTextWatcher tw und Time24hFormatValidator time24;
    Kenne ich leider nicht.



    txt3.addTextChangedListener(time24);

    wieso machst du voher das txt3.addTextChangedListener(tw); eins von beiden solte genügen.

    Ich sehe keine instanz von time24 meine sowas wie
    Time24hFormatValidator time24 = new Time24hFormatValidator ();





    verstehe auch nicht was
    EditText txt4 = (EditText) ze.lastRow.getChildAt(1);
    in der Zeiterfassung 3 soll. wenn du auf den Edittext in der Main zugreifen willst wieso erstellst du eine neue Variable.
    mache die ganze Prüfung auf richtige Urzeit in der main und gieb dann erst weiter wen die eingabe gültig war.
    also gleich nach "EditText txt3 = new EditText(MainActivity.this);" prüfen





  • Hi und danke für die Antwort


    Die Idee war halt, dass zwei Textwatcher unabhängig voneinander die Zellen prüfen


    newRowTextWatcher tw und Time24hFormatValidator time24 sind neu angelegte Java Klassen, die dafür geschaffen wurden: es sind textwatcher, die einen Eintrag in eine beliebige der Tabellenzellen prüfen und, falls einee vorhanden ist, eine neue Zeile hinzufügen (tw). Der zweite (time24) prüft, ob die Zeit das richtige Format hat (zumindest in der Theorie)


    Es sollen halt beide laufen können
    Könnte es sein, dass wegen tw time24 immer leere Zeilen vorfindet?

  • Könnte es sein, dass wegen tw time24 immer leere Zeilen vorfindet?
    kann sein habe es nicht geprüft.


    meiner Meinung nach müsstest du erst prüfen und dann erst setzen mit txt3.addTextChangedListener(tw);


    wird denn die Prüfrutiene denn Überhaupt aufgerufen denn von der neuen Klasse hast du keine Instanz


    Wie gesagt kenne ich newRowTextWatcher nicht weiß nicht was da gemacht wird . Diese lib ist mir nicht bekannt.

  • Also die neue Zeile fügt er ohne weiteres hinzu


    Bin grad nicht zuhause, deshalb kann ich den Code nicht prüfen
    Aber in meiner Main müsste stehen


    txt1.addTextChangedListener(tw);
    ...
    txt7.addTextChangedListener(tw);


    txt3.addTextChangedListener(time24);
    txt4.addTextChangedListener(time24);


    Auch in der Reihenfolge


    Und tw macht er und fügt auch eine Zeile hinzu, sobald in eine der 7 Zellen der Tabelle irgendwas eingetragen wurde


    Nur die time24 übergeht er halt komplett, es gibt auch keinen error oder crash, aber ich kann halt z.B. 13:65 eintragen

  • in diesen link ist es nicht so
    gist.github.com/anonymous/a0e3f50f60bfcd8b27144ba40106342d


    T1 tw
    T2 tw
    T3 time24
    T4 time24
    T5 tw
    .
    .
    Bin nur am Handy da ist das tippen umständlich.
    Wie gesagt ohne Instanz initialisieren der Kasse wird es nicht gehen.
    Schicke mir mal etwas zu newRowTextWatcher, TextWatcher
    Kenne ich nicht habe damit noch nicht gearbeitet.

  • Zeige mal deine newRowTextWatcher Klasse Methode oder was das ist.
    Mal was anderes du willst doch bestimmt auch deine Daten Speichen und vielleicht später wieder anzeigen. Wie hast du dir das gedacht? Denn das ist ja alles nur solange gültig wie die app läuft beim beenden ist alles weg.

  • Also du hast zwar in deiner neuen Klasse einen Konstruktor dem der context der activity übergeben werden soll.,den rufst du aber nicht auf. Somit hast du auch nicht den context und auch keinen Bezug zu der edit Text Variablen aus der Main .


    Müsste in etwa so aussehen
    txt3.addTextChangedListener(new time24(this));
    also den bezug zu deiner MainActivity.

  • Zeige mal deine newRowTextWatcher Klasse Methode oder was das ist.
    Mal was anderes du willst doch bestimmt auch deine Daten Speichen und vielleicht später wieder anzeigen. Wie hast du dir das gedacht? Denn das ist ja alles nur solange gültig wie die app läuft beim beenden ist alles weg.

    Das möchte ich definitiv, am liebsten einmal lokal und später dann in einer Datenbank


    Wie ich das mache, weiß ich leider nicht
    Ich lade heute Abend alles aus der App hoch
    Ich danke dir/Ihnen auf jeden Fall jetzt schon vielmals für die Hilfe :)

  • Hi auch bei deinen "tw" Übergiebst du keinen Context. Prüfe mit dem Debugger ob die "ze" Variable in der Kasse einen Wert hat .
    werden diese zeilen überhaupt aufgerufen?
    public newRowTextWatcher(MainActivity Zeiterfassung)
    { ze = Zeiterfassung; }


    auch hast du die reien folge nicht so wie ich es in Post Nr.6 angedeutet habe.


  • Habe es dir doch oben als code beispiel gegeben.
    Schaue dir objektorientierte Programmierung noch mal an.
    Du Definierst zwar ein Objekt oder Variable "public Time24hFormatValidator time24;"
    aber ein Objekt wird nicht erstellt das wird in Java mit "new" gemacht dabei wird der Konstruktor aufgerufen wenn er nicht überladen ist wird der Standart Konstucktor aufgerufen "Time24hFormatValidator time24()"
    du Hast ihn überladen und willst eigentlich das dieser aufgerufen wird


    "public Time24hFormatValidator(MainActivity Zeiterfassung) {
    ze = Zeiterfassung;
    }"


    dies würdest du mit


    public Time24hFormatValidator time24;
    time24 = new Time24hFormatValidator(this ) ;




    machen.

  • also quasi


    public class MainActivity extends AppCompatActivity {


    public TableRow lastRow;
    public newRowTextWatcher tw;{
    tw= new newRowTextWatcher(this);}
    public Sum sum;{
    sum= new Sum(this);}
    public Time24hFormatValidator time24;{
    time24 = new Time24hFormatValidator(this );}

  • wobei ich mir nicht sicher bin ob es this ist oder getApplicationContext().
    prüfe mit dem Debugger mache einen Brackpoint auf die Methoden in deiner Klasse.


    developer.android.com/studio/debug/index.html
    stackoverflow.com/questions/32…o-debug-in-android-studio
    learnhowtoprogram.com/android/…-and-the-android-debugger

  • "cannot resolve symbol context"


    Ich verstehe ehrlich gesagt nur Bahnhof
    Das passiert halt, wenn man eine Java Aufgabe jemandem wie mir gibt, der seinen Lebtag nie mit Java zu tun hatte


    Gibt es eine Möglichkeit, alle geforderten Funktionen nur in der MainActivity.java zu definieren?
    Weil ich glaube, je mehr Klassen ich aufstelle ( Time24hFormatValidator,newRowTextWatcher usw.) desto schlimmer wird es

  • dann mache es ohne Klasse musst in den Methoden deinen Code einfügen.


    hatte leider in dem vorherigen code einen fehler .
    du brauchst gar keine Objektvariable sondern kanst gleich die Klasse nehmen.
    txt3.addTextChangedListener( new Time24hFormatValidator(getApplicationContext()));
    oder
    txt3.addTextChangedListener( new Time24hFormatValidator(this));
    wie gesagt weiß nich genau ob this oder getApplicationContext() teste mal.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!