1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

EditText mit SeekBar koppeln

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von AquaBall, 06.03.2012.

  1. AquaBall, 06.03.2012 #1
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    Ich möchte ein EditText mit einem SeekBar koppeln.

    Ein Verschieben des SeekBar soll sofort den Text im EditText ändern, (in diese Richtung funktioniert es perfekt)
    Code:
    import android.widget.SeekBar.OnSeekBarChangeListener;
    ...
            sbBar.setOnSeekBarChangeListener( new OnSeekBarChangeListener()
            {   public void onProgressChanged(SeekBar seekBar, int position,
                        boolean fromUser)
                {
                    edVorgabe.setText(String.valueOf(position));
                }  
    ...
    und umgekehrt soll eine Textänderung SOFORT einen Seekbar anpassen.

    Also wenn z.B. die Zahl 75 getippt wird soll beim 7er auf die Position "7" gesprungen werden und beim 5er dann auf die "75". Ohne dass Enter gedrückt werden muss, oder das Feld verlassen wird.
    Das gelingt mir aber völlig unbrauchbar!
    Versucht habe ich es (u.a.) mit
    Code:
    import android.view.View.OnKeyListener;
    ...
            edVorgabe.setOnKeyListener( new OnKeyListener()
     //TODO Das funktioniert noch recht seltsam!
            {    @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    int position=Integer.parseInt(edVorgabe.getText().toString());
                    sbBar.setProgress(Position);
                    return false;
                }
        
            });
    ...
    Aber das verhält sich sehr merkwürdig. (Wird immer erst um 1 Eingabe zu spät erkannt. Cursor spring nach jeder Eingabe an den Anfang, ...)

    Wie kann ich ein EditText mit einem SeekBar koppeln?

    Ich scheitere ich daran, dass ich auch keine aussagekräftige Beschreibung finde.
     
  2. Sentence, 07.03.2012 #2
    Sentence

    Sentence Erfahrener Benutzer

    Beiträge:
    242
    Erhaltene Danke:
    51
    Registriert seit:
    27.01.2011
    Phone:
    S3, S6 Edge
    Moin,
    das sollte mit nem TextWatcher besser funktionieren.

    Du erstellst den TextWatcher:
    Code:
    private final TextWatcher mTextWatcher = 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) {
    
    		}
    
    		@Override
    		public void afterTextChanged(Editable s) {
    		}
    
    	};
    
    und bindest ihn an dein EditText

    edVorgabe.addTextChangedListener(mTextWatcher);

    MfG
     
  3. AquaBall, 07.03.2012 #3
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    Danke für den Versuch.
    Leider funktioniert das genauso schlecht wie OnKey.
    Nach jeder Eingabe (Ziffer tippen oder löschen) springt der Cursor an den Anfang des Feldes.
    Normales Eingeben, oder gar Editieren ist unmöglich.

    Außerdem: wie weiß ich dann welches EditText gerade betroffen ist?
    Getestet hab ich es momentan "absolut", aber später werde ich mehrere Felder haben.
     
  4. swordi, 07.03.2012 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ich glaub mal da kommt was anderes quer. der textwatcher verschiebt den cursor sicher nicht.

    bzgl mehreren edittext feldern
    du kannst entweder mehrere textwatcher bauen oder einen eigenen textwatcher erzeugen, dem du das edittext feld mit gibst.
     
  5. AquaBall, 07.03.2012 #5
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    -
     
    Zuletzt bearbeitet: 07.03.2012
  6. AquaBall, 07.03.2012 #6
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    Danke das wars!

    Ich ahbe einen TextWatcher (oder OnKey)
    und einen setOnSeekBarChangeListener.

    Der TextWatcher hat den SeekBar verschoben.
    Und der hat dann (offensichtlich) gemeint er muss das Editfeld anpassen.

    Daraus meine Fragen:

    • Lieg ich mit der Vermutung richtig, dass programmgesteuerte Änderung des SeekBars auch den ChangeListener auslöst?
    • Gilt das auch für das EditView, wenn ich Seekbar verschiebe?
    • Wie kann ich diese Rückkoppelung verhindern?
    Also dass eine SeekBar-Aktualisierung durch die EditText-Änderung nicht eine neue EditText-Änderung auslöst.
    und eine EditText-Aktualisierung durch die SeekBar-Betätigung nicht eine neue SeekBar-Betätigung auslöst.

    Und: Wo kann ich solche Details in der Developer-Referenz rauslesen?

    Zur besseren Erklärung hier mein bisheriger Code:
    (Bin für alle Anregugnen dankbar)
    Code:
        public void onCreate(Bundle savedInstanceState) {
            ...
            edVorgabe.addTextChangedListener(new SyncedTextWatcher(edVorgabe,sbBalken));
            sbBalken.setOnSeekBarChangeListener( new OnSeekBarChangeListener()
            {   public void onProgressChanged(SeekBar seekBar, int progress,
                        boolean fromUser)
                {  edVorgabe.setText(String.valueOf(progress));
    //TODO noch buggy: TextÄnderung löst BarÄnderung aus löst TextAnpassung aus.
    // Dadurch verhält sich das Programm so, als würde nach jeder Taste das EditText verlassen und wieder betreten (Cursor am Anfang) 
                }
            ...
            });
        }
    
    /** Eingaben aus einem EditText werden sofort mit Seekbar synchronisiert. 
     * @author Me
     */
        private class SyncedTextWatcher implements TextWatcher {
            private EditText myEdit;
            private SeekBar mySeekBar;
            /**
             * @param editText Eingaben in diesem Feld werden direkt (interaktiv/dynamisch) an ein seekBar weitergegeben.
             * @param seekBar Dieses seekbar wird über das Eingabefeld editText angepasst
             */
            public SyncedTextWatcher(EditText editText, SeekBar seekBar) {
                myEdit=editText;
                mySeekBar=seekBar;
            }
        
            @Override
            public void afterTextChanged(Editable s) {
                int progress=0;
                try    {
                    progress = Limits(Integer.parseInt(myEdit.getText().toString()),1,maxQPt);
                } catch (NumberFormatException err) {
                    if (myEdit.getText().toString().equals(""))
                    {    progress=1;
                    } else 
                    {    meldeDich("parseInt misslungen");
                    }
                };
                mySeekBar.setProgress(progress);
            }
    ...
        }
    
     
  7. JanF, 07.03.2012 #7
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Du liegt mit Deiner Vermutung richtig.
    Warum nutzt Du nicht einfach die boolsche Variable fromUser in Deinem OnSeekBarChangeListener? Damit läßt sich die Rückkopplung vermeiden.
     
  8. AquaBall, 07.03.2012 #8
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    Wann (von wem) wird die gesetzt?
     
  9. AquaBall, 07.03.2012 #9
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    Danke funktioniert perfekt!

    (hab ich zu früh gefragt)
     
  10. JanF, 07.03.2012 #10
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    AquaBall bedankt sich.
  11. AquaBall, 07.03.2012 #11
    AquaBall

    AquaBall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    121
    Erhaltene Danke:
    2
    Registriert seit:
    29.02.2012
    Wohl war, aber man muss es auch lesen können.
    Damit kämpf ich augenblicklich noch am meisten.

    z.B.
    Code:
    Parameters: fromUser = True if the progress change was initiated by the user.
    An sich selbsterklärend, um nicht zusagen: überflüssiger Kommentar,
    aber letzlich nicht schlüssig, wenn man den Umgang noch nicht gewohnt ist.
    Wenn der User ein Feld ändert, dann ist ea ja auch von ihm initiiert, und nicht z.B. von einem Timer ähnlichem.

    Aber langsam nähere ich mich schon einem stabileren Umgang mit der ganzen Thematik.
    Danke für die Hilfe.
     

Diese Seite empfehlen