2013-12-08 3 views
3

В настоящее время у меня есть приложение, использующее таймер, и у меня есть текст редактирования, который меняет время. Я хотел бы добавить функцию, которая автоматически вставляет двоеточие или период после того, как определенное количество символов было введено, так как синтаксис для изменения времени определен (это должно быть XX: XX.X)Изменение символов в EditText при наборе текста? Android

У меня есть играл с ним, и это только дает мне ошибку, когда я пытаюсь изменить текст editText. Ошибка при попытке ввода.

скопировать и вставить код, я нашел здесь и изменил его, чтобы соответствовать моим потребностям/

editClock = (EditText) findViewById(R.id.editClock);  
editClock.addTextChangedListener(new TextWatcher(){ 
    int count =1 ; 
    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) 
    { 
     //System.out.println("beforeTextChanged::: => "+charSequence); 
    } 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
     //System.out.println("onTextChanged::: => "+charSequence); 
    } 

    @Override 
    public void afterTextChanged(Editable editable) { 
     if(count==2) 
      editClock.setText(editable.toString()+":"); 
     if(count==4) 
      editClock.setText(editable.toString()+"."); 
     count++;  
    } 
}); 

Это ошибка, я получаю:

12-07 20:34:08.380: E/AndroidRuntime(13549): FATAL EXCEPTION: main 
12-07 20:34:08.380: E/AndroidRuntime(13549): java.lang.StackOverflowError 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidtext.TextUtils.getChars(TextUtils.java:77) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidtext.TextUtils.indexOf(TextUtils.java:110) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidtext.StaticLayout.generate(StaticLayout.java:182) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidtext.DynamicLayout.reflow(DynamicLayout.java:284) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidtext.DynamicLayout.<init>(DynamicLayout.java:170) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.makeSingleLayout(TextView.java:6058) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.makeNewLayout(TextView.java:5956) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.checkForRelayout(TextView.java:6495) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3771) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3604) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at com.example.timeonice.MainActivity$2.afterTextChanged(MainActivity.java:149) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.sendAfterTextChanged(TextView.java:7334) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3778) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.TextView.setText(TextView.java:3629) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at  androidwidget.EditText.setText(EditText.java:80) 
12-07 20:34:08.380: E/AndroidRuntime(13549): at an 
+1

Какая ошибка? Одна вещь, чтобы быть осторожным при использовании TextChangedListener получает рекурсию - когда вы устанавливаете текст, убедитесь, что вы не запускаете другой onTextChanged(). –

+0

добавил logcat, не уверен, что это помогает – user3078867

+0

Да, это помогает. Вы получаете бесконечную рекурсию. –

ответ

2

Один из способов исправить это является поставить флаг уровня класса в свой код. Установите флаг, когда вы собираетесь вызвать setText(), и затем очистите его. Затем, в начале afterTextChanged(), проверьте свой флаг. Что-то вроде этого:

@Override 
public void afterTextChanged(Editable editable) { 
    if (overridingText) 
    return; 

    if(count==2) 
    { 
    overridingText = true; 
    editClock.setText(editable.toString()+":"); 
    overridingText = false; 
    } 
    else if(count==4) 
    { 
    overridingText = true; 
    editClock.setText(editable.toString()+"."); 
    overridingText = false; 
    } 

    count++;  
} 

Возможно, Google предоставил лучший способ сделать это. Хотя я не знаю.

+0

Фантастический! Он отлично работает, единственное, что он устанавливает курсор в начало EditText после того, как он вставляет двоеточие или период. – user3078867

+0

вы можете использовать setSelection() для перемещения курсора. –