2010-11-13 3 views
6

Возможно ли автоматическое вставлять символы в EditText, поскольку пользователь вводит данные?Живое редактирование ввода пользователей

I.e. если пользователь вводит длинное число, например 123456789012, возможно ли, чтобы этот номер появился, когда он вводит его в текстовое поле редактирования, но с тире каждый 4-й символ?

Так как вы вводите число выше, вы увидите, что оно вводится в поле EditText, но будет выглядеть так: 1234-5678-9012.

В настоящее время у меня есть приложение, в котором вы можете ввести длинное число, а затем нажать кнопку, и он вставляет тире для вас, но мне любопытно, можно ли это сделать по мере ввода?

Большое спасибо за помощь.

+1

Какой язык? Какая платформа? Это, в общем, возможно, но детали зависят от языка и платформы. – Oded

+0

В какой технологии? Например. на веб-странице, приложении для iPhone и т. д. –

ответ

11

Помечая андроид, я думаю, что вы обсуждаете о андроиде EditText, так что вы можете сделать это путем прослушивания TextChangedListener,

Редакцией: для забоя

editText.addTextChangedListener(new TextWatcher() { 
      int len=0; 
      @Override 
      public void afterTextChanged(Editable s) { 
       String str = editText.getText().toString(); 
       if(str.length()==4&& len <str.length()){//len check for backspace 
        editText.append("-"); 
       } 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 

      String str = editText.getText().toString(); 
       len = str.length(); 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      } 


     }); 
+0

Отлично. Большое спасибо за ответ. – Entropy1024

+1

Обработайте также удаления - приведенный пример может сделать невозможным обратное пространство после ввода 4 символов (поскольку удаление тире немедленно добавит еще один). – Nick

+0

@Nick, я отредактировал его для backspace, так что это не невозможно –

0
@Override 
public void afterTextChanged(Editable s) { 

    if(s.length() == 3 && len < s.length()){ 
     s.append(" - "); 
    } 

} 

@Override 
public void beforeTextChanged(CharSequence s, int start, int count, 
     int after) { 
    len = s.length(); 
} 

Это будет делать, ну, только этот код вставляет " - " после третьего символа.

0

Это то, что я использовал

private boolean mInEdit; 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (!mInEdit) { 
     mInEdit = true; 
     String delimiter = " - "; 
     //Remove chars from your delimiter first 
     String digits = s.toString().replaceAll("[- ]", "") 
       .replaceAll("\\d{4}", "$0" + delimiter); 
     //Handle deletion 
     int dLength = delimiter.length(); 
     if (before > count && digits.endsWith(delimiter.charAt(dLength - 1)) { 
      digits = digits.substring(0, digits.length() - dLength); 
     } 
     mCardNumber.setText(digits); 
     mCardNumber.setSelection(mCardNumber.length()); 
     mInEdit = false; 
    } 
} 

Здесь вы заменить разделитель с тем, что вы хотите, чтобы отделить цифры.

0

Для тех, кто до сих пор сталкиваются проблемы с BackSpace и несколькими черточками -

new TextWatcher() 
{ 
     boolean hyphenExists; 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      if (s.length() >= 6 && s.charAt(5) == '-') { 
       hyphenExists = true; 
      } else { 
       hyphenExists = false; 
      } 

      Log.d("TAG", "beforeTextChanged " + s.toString()); 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      Log.d("TAG", "onTextChanged " + s.toString()); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (s.length() == 5) { 
       if (!hyphenExists) 
        s.append('-'); 
      } 
      Log.d("TAG", "afterTextChanged " + s.toString()); 
     } 
    } 
6

, чтобы решить эту проблему, я пишу класс "AutoAddTextWatcher":

1. Автоматическая вставка текста в EditText.
2. Вставьте текст в EditText в положения, которые вы настроили.
3. удалить текст в EditText в позициях вас выставиться, когда длина текста больше, чем 1.

enter image description here

фрагмент кода:

mEditText_birthday.addTextChangedListener(new AutoAddTextWatcher(mEditText_birthday, 
      "/", 
      new TextWatcher() {}, 
      4, 6)); 

AutoAddTextWatcher класса

import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.EditText; 


/** 
* Created by henry.chuang on 2016/5/12. 
*/ 
public class AutoAddTextWatcher implements TextWatcher { 
    private CharSequence mBeforeTextChanged; 
    private TextWatcher mTextWatcher; 
    private int[] mArray_pos; 
    private EditText mEditText; 
    private String mAppentText; 

    public AutoAddTextWatcher(EditText editText, String appendText, int... position){ 
     this.mEditText = editText; 
     this.mAppentText = appendText; 
     this.mArray_pos = position.clone(); 
    } 
    public AutoAddTextWatcher(EditText editText, String appendText, TextWatcher textWatcher, int... position){ 
     this(editText, appendText, position); 
     this.mTextWatcher = textWatcher; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     mBeforeTextChanged = s.toString(); 

     if(mTextWatcher != null) 
      mTextWatcher.beforeTextChanged(s, start, count, after); 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     for (int i = 0; i < mArray_pos.length; i++) { 
      if(((mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] - 1) && 
        (s.length() - mAppentText.length() * i) == mArray_pos[i])){ 
       mEditText.append(mAppentText); 

       break; 
      } 

      if(((mBeforeTextChanged.length() - mAppentText.length() * i) == mArray_pos[i] && 
        (s.length() - mAppentText.length() * i) == (mArray_pos[i] + 1))){ 
       int idx_start = mArray_pos[i] + mAppentText.length() * i; 
       int idx_end = Math.min(idx_start + mAppentText.length(), s.length()); 

       String sub = mEditText.getText().toString().substring(idx_start, idx_end); 

       if(!sub.equals(mAppentText)){ 
        mEditText.getText().insert(s.length() - 1, mAppentText); 
       } 

       break; 
      } 

      if(mAppentText.length() > 1 && 
        (mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length()) && 
        (s.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length() - 1)){ 
       int idx_start = mArray_pos[i] + mAppentText.length() * i; 
       int idx_end = Math.min(idx_start + mAppentText.length(), s.length()); 

       mEditText.getText().delete(idx_start, idx_end); 

       break; 
      } 

     } 

     if(mTextWatcher != null) 
      mTextWatcher.onTextChanged(s, start, before, count); 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     if(mTextWatcher != null) 
      mTextWatcher.afterTextChanged(s); 

    } 

} 

полный демонстрационный источник:
https://github.com/henrychuangtw/AutoInsertEditText

+0

Wow dude! Ты гений! Большое вам спасибо за это ... Я пробовал МНОГО РЕШЕНИЙ, но ничего не получилось. Мне нужно было отформатировать его так: 12-345-67. Каждое другое решение всегда имело странные вещи, когда вы удаляли, а затем пытались повторно войти. Ваши решения работают ОТЛИЧНО! Одно дело отметить, что для того, чтобы ваш класс работал правильно, вам нужно установить тип ввода в файле XML на «android: inputType =« phone »« Сначала я попытался использовать «android: inputType =« number »', и он не сделал Не работай. Я проверил вашу страницу github и увидел, что вы использовали «телефон», и теперь это работает. Отличная работа! –

+0

Вот моя реализация: 'enterUserID.addTextChangedListener (новый AutoAddTextWatcher (enterUserID, " - ", 2, 5));' –

+0

@KevinBright Спасибо за ваше одобрение и предложение, я попробую. – HenryChuang

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