Edittext: Leertaste verhindern

  • 12 Antworten
  • Letztes Antwortdatum
Jaiel

Jaiel

Dauer-User
235
Hallo gibt es eine Möglichkeit im Edittext das Leerzeichen zu verhindern ohne zu prüfen ob Leerzeichen enthalten sind oder kann man auf einfache Weise den Eingaben zuhören und so Leerzeichen verhindern bzw. alles was ausserhabl A-Z ist unterbinden für API 14+?
 
Also ich denke, du könntest etwas mit dem TextChangedListener anfangen:
Code:
((EditText)findViewById(R.id.edtPinCod)).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) {
                setPasswortStars(s.toString());

                if(passwortschutzPW.equals(s.toString()))
                {
                    finish();
                }
                else if(s.toString().length() == 4)
                {
                   
                }

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

Hier setze ich beispielsweise Sternchen in ein anderes Feld. Und wenn das Passwort stimmt, dann wird die Activity geschlossen, ohne das der Benutzer noch auf "Fertig" klicken muss oder so.
 
okay das scheint gut auszusehen.

Aber eine Sache ncoh: Wann werden die einzelnen MEthoden aufgerufen. onTextChanged verstehe ich ncoh, afterTextChanged () bestimmt wenn der Fokus verloren geht also der User klickt das Keyboard weg(???) zum Beispiel. BeforeChanged ist interressant. Und onTextChanged ist dann wenn der User fertig ist mit der Eingabe?!

Also so ungefähr dann:

Code:
mEditText=((EditText)findViewById(R.id.edtPinCod)).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) {
                String editTextString=s.toString();
                editTextString=editTextString.replaceAll("\\s","");        //Leerzeichen entfernen        
                editTextString=editTextString.replaceAll("\\W","");       //alle nicht-Wörter entfernen
                mEditText.setText(editTextString);
             

            }

            @Override
            public void afterTextChanged(Editable s) {


            }
        });


Gibt es auch einen KeyListener so dass ich den User sofort mit einem Toast informieren kann das er diesen Charakter nciht benutzen kann und die Eingabe ins leere laufen lassen kann?
 
Hallo

Ich habe es jetzt so gemacht:

Code:
mEditText.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) {
                

                }

                @Override
                public void afterTextChanged(Editable s) {
                    String editTextString=s.toString();
                    editTextString=editTextString.replaceAll("\\s","");        //Leerzeichen entfernen  
                    editTextString=editTextString.replaceAll("\\W","");       //alle nicht-Wörter entfernen
                    if(!s.toString().equals(editTextString))
                    {
                        mEditText.setText(editTextString);
                        Toast.makeText(getBaseContext(),"Only a/A - z/Z",Toast.LENGTH_SHORT).show();
                    }


                }
            });


Wie kann ich denn den Cursor wieder an die vorherige Stelle schicken? Der wird jetzt nämlich wieder an den Anfang gesetzt
 
Ich habe deinen Code mal in mein Testprojekt kopiert.

In meinem alten produktiven Code habe ich dann die Lösung gefunden:

Code:
String editTextString=s.toString();
                editTextString=editTextString.replaceAll("\\s","");        //Leerzeichen entfernen
                editTextString=editTextString.replaceAll("\\W","");       //alle nicht-Wörter entfernen
                if(!s.toString().equals(editTextString))
                {
                    text.setText(editTextString);
                    Toast.makeText(getBaseContext(), "Only a/A - z/Z", Toast.LENGTH_SHORT).show();
                }

                text.requestFocus();
                text.setSelection(text.getText().length());

Also das requestFocus und das setSelection sind die Lösung. (Ich habe es jetzt nur in onTextChanged getestet und nicht in afterTextChanged.
 
Jo genau habe es jetzt auch mit setSelection gemacht.

Habe ncoh eine Frage: Ich zentriere meinen EditText und da stört mcih etwas: Der Cursor ist mitten im Hinttext und nach der Eingabe ist er auch noch da. Hat das etwas mit dem Fokus zu tun? Wie kriege ich ihn da weg?
 
Hier der Code übrigens ich glaube der request focus ist nciht notwendig ...

Code:
@Override
                public void afterTextChanged(Editable s) {
                    String editTextString=s.toString();
                    editTextString=editTextString.replaceAll("\\s","");       //Leerzeichen entfernen  
                    editTextString=editTextString.replaceAll("\\W","");       //alle nicht-Wörter entfernen
                    editTextString=editTextString.replaceAll("\\d+", "");      //Zahlen ebenfalls
                    if(!s.toString().equals(editTextString))
                    {
                        mEditText.setText(editTextString);
                        Toast.makeText(getBaseContext(),getString(R.string.onlyatoz),Toast.LENGTH_SHORT).show();
                        mEditText.setSelection(mEditText.getText().length());
                    }


                }

Achja onTextChanged verursacht Fehler man darf von dort aus ncihts ändern. Steht in der Doku und habe die Erfahrung gemacht dass ich mein Handy aufgehangen habe :(
afterTextChange wird sofort aufgerufen wenn irgendwas verändert wird im Text
onTextChanged ist dann wen die Länge verändert wird glaube ich


Laut Doku ist es jedenfalls ein Fehler dort Veränderungen zu amchen
 
Gehts jetzt? :p
 
Jo geht jetzt nur mich stört der Cursor wie kann man den entfernen? Der soll einfach nicht mehr sichtbar sein nur beim editieren..
 
setCursorVisibile(false)...
oder in xml. android:cursorVisible="false"
 
  • Danke
Reaktionen: Jaiel
Danke schön hat wunderbar geklappt...
 
Eine Alternative dazu ist die Verwendung eines InputFilters. Damit kannst Du gezielt Zeichen ausfiltern, oder z.B. eine Maximal-Länge für den Input angeben.

Ein Beispiel:


Code:
InputFilter filter[] = new InputFilter[2];
filter[0] = new MyInputFilter();
filter[1] = new InputFilter.LengthFilter(30);
myEditText.setFilters(filter);

Code:
public class MyInputFilter implements android.text.InputFilter {

   public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
      //Filter alle Steuercodes aus
      boolean textIsLegal = true;
      for (int i=0; i<source.length(); i++) {
         if (source.charAt(i) < 33) textIsLegal=false;
      }
      if (!textIsLegal) return("");
      else return(null);
   }
}
 
  • Danke
Reaktionen: Jaiel
Hallo Wilco,

danke für diesen Tipp. Ich programmiere schon länger mit Android aber irgendwie habe ich noch nie was von InputFiltern gehört, oder wieder vergessen :)
 
Zurück
Oben Unten