EditText mit SeekBar koppeln

A

AquaBall

Fortgeschrittenes Mitglied
2
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.
 
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
 
Sentence schrieb:
Moin,
das sollte mit nem TextWatcher besser funktionieren.
Code:
private final TextWatcher mTextWatcher = new TextWatcher() {
        public void afterTextChanged(Editable s) {
edVorgabe.addTextChangedListener(mTextWatcher);
MfG
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.
 
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.
 
-
 
Zuletzt bearbeitet:
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);
        }
...
    }
 
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.
 
Wann (von wem) wird die gesetzt?
 
Danke funktioniert perfekt!

(hab ich zu früh gefragt)
 
Ein Blick in die Api wirkt oft wunder:
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.
 

Ähnliche Themen

H
Antworten
4
Aufrufe
606
HTCUserRay
H
A
  • Alex1978
Antworten
4
Aufrufe
816
Alex1978
A
B
Antworten
4
Aufrufe
470
bb321
B
Zurück
Oben Unten