2016-09-06 1 views
0

У меня есть четыре поля EditText, которые вместе составляют значение. Каждый ящик должен содержать 1 номер. Когда я ввожу число в один квадрат, фокус должен перейти к следующему полю. Я «подделал» связь между полями, изменив фокус при изменении текста. Следующий код работает, но я хочу разрешить пользователю вставлять значения, которые затем будут разбиты на поля EditText. Поэтому, если я вставляю «123» в поле [0], поле [0] должно содержать «1», а поле [1] должно содержать «2» и т. Д. Я попытался добавить android:maxLength="1" в XML, но когда я пытаюсь вставить содержимое, проверка maxLength удаляет все, кроме первого символа.Связанные прямоугольники EditText для вставки

Каков наилучший способ разделить содержимое пасты на 4 окна EditText?

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"/> 

ответ

0

Есть, вероятно, несколько способов сделать это, но я бы, вероятно, удалить текст предел 1 по тексту редактирования и управлять длиной с помощью наблюдателя текста.

Здесь, если текст вставляется в первый edit1, тогда наблюдатель текста разбивает значения на другие текстовые поля редактирования. Вы должны быть осторожны при изменении текста в обратном вызове afterTextChanged, поскольку изменение инициирует другой вызов метода. Поскольку длина текста в edit1 только одна после нашей обработки, следующий обратный вызов ничего не делает.

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))); 
     } 



     } 
    }; 

} 
Смежные вопросы