2016-09-06 3 views
0

Ich habe vier EditText-Felder, die zusammen einen Wert bilden. Jede Box sollte 1 Nummer enthalten. Wenn ich eine Zahl in eine Box eingabe, sollte der Fokus zur nächsten Box gehen. Ich habe eine Verknüpfung zwischen den Boxen "gefälscht", indem ich den Fokus ändere, wenn der Text geändert wird. Der folgende Code funktioniert, aber ich möchte zulassen, dass der Benutzer Werte einfügt, die dann in den EditText-Feldern aufgeteilt werden. Wenn ich also "123" in die Box [0] einfüge, sollte die Box [0] "1" enthalten und die Box [1] "2" usw. Ich habe versucht, android:maxLength="1" in das XML einzufügen, aber wenn ich Inhalte einfügen möchte, Die Validierung von maxLength entfernt alle bis auf das erste Zeichen.Verknüpfte EditText Boxen für Einfügen

Was ist der beste Weg, den Inhalt einer Paste über die 4 EditText-Boxen zu teilen?

EnterNumberLayout.java

public class EnterNumberLayout extends LinearLayout { 
    EditText[] textBoxes; 

    public static final int NUMBER_OF_ENTRIES = 4; 

    public EnterNumberLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     this.setOrientation(HORIZONTAL); 

     textBoxes = new EditText[NUMBER_OF_ENTRIES]; 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     for (int i = 0; i < NUMBER_OF_ENTRIES; i++){ 
      EditText et = (EditText) inflater.inflate(R.layout.number_box, null); 
      //et.setOnKeyListener(new BackspaceKeyListener(et)); 
      et.addTextChangedListener(new MoveFocusWatcher(et)); 
      et.setTag(i); 

      textBoxes[i] = et; 
      this.addView(et, i); 
     } 
    } 

    private class MoveFocusWatcher implements TextWatcher { 

     private View view; 
     public MoveFocusWatcher(View view) { 
      this.view = view; 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if ((int) this.view.getTag() < NUMBER_OF_ENTRIES - 1) { 
       (textBoxes[(int) this.view.getTag() + 1]).requestFocus(); 
      } 
     } 

     public void afterTextChanged(Editable s) {} 
    } 

} 

number_box.xml

<?xml version="1.0" encoding="utf-8"?> 
<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:inputType="number|none" 
android:ellipsize="start" 
android:gravity="center_horizontal|center_vertical" 
android:imeOptions="actionNext"/> 

Antwort

0

Es gibt wahrscheinlich ein paar Möglichkeiten, dies zu tun, aber ich würde wahrscheinlich den Text Grenze von 1 auf dem Bearbeiten von Text entfernen und Verwalten Sie die Länge mit einem Textwatcher.

Wenn Text in das erste Edit1 eingefügt wird, teilt der Textwatcher die Werte in die anderen Edit-Textfelder auf. Sie müssen beim Ändern von Text im afterTextChanged-Callback vorsichtig sein, da die Änderung einen weiteren Aufruf der Methode auslöst. Da die Textlänge in edit1 nur eine nach unserer Verarbeitung ist, macht der nächste Callback nichts.

public class TextGroup extends LinearLayout { 


    EditText edit0; 
    EditText edit1; 
    EditText edit2; 
    EditText edit3; 

    public TextGroup(Context context, AttributeSet attrs) { 
     super(context); 

     View view = LayoutInflater.from(context).inflate(R.layout.edit_text_special, null); 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

     edit0 = (EditText) view.findViewById(R.id.edit_text0); 
     edit1 = (EditText) view.findViewById(R.id.edit_text1); 
     edit2 = (EditText) view.findViewById(R.id.edit_text2); 
     edit3 = (EditText) view.findViewById(R.id.edit_text3); 

     edit1.addTextChangedListener(watcher); 
     this.addView(view, lp); 
    } 

    TextWatcher watcher = new TextWatcher() { 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int start, int count, int after) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
     if (edit1.getText().length() >= 3) { 
      edit3.setText(String.valueOf(edit1.getText().toString().charAt(2))); 
     } 
     if (edit1.getText().length() >= 2) { 
      edit2.setText(String.valueOf(edit1.getText().toString().charAt(1))); 
      edit1.setText(String.valueOf(edit1.getText().toString().charAt(0))); 
     } 



     } 
    }; 

} 
Verwandte Themen