Вопрос по java, android – EditText - изменить текст при наборе текста

12

Мне нужно заменить текст внутри EditText при наборе: Пример: если пользователь нажал «A» это будет сохранено в буфере и в EditText & quot; D & quot; вместо этого отображается (выглядит так, как будто он нажал «D»). Теперь я могу прочитать нажатый символ, но не могу отобразить любой символ в et, чтобы избежать переполнения стека:

final EditText et = (EditText) findViewById(R.id.editTexts);
    final TextView tv = (TextView) findViewById(R.id.textView2);

    et.addTextChangedListener(new TextWatcher()
    {
            public void afterTextChanged(Editable s){}
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            } 
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.length() > 0) {
                    tv.setText(s.toString().substring(s.length()-1));
                    et.setText("");
                }
            }
    });
видеть это ..........................stackoverflow.com/questions/9498155/… Dheeresh Singh
это не тот же вопрос !! Issam Zoli
попробуйте s.clear (); после установки s для вашего textView Pradeep
один и тот же вопрос дваждыstackoverflow.com/questions/10862343/… Ishu

Ваш Ответ

3   ответа
2
Ссылка без каких-либо объяснений бесполезна по нескольким причинам. И особенно в этом случае, когда это просто ссылка на документы, вероятно, первое место, куда люди пойдут с этим вопросом.
8

Для того, чтобы изменить текст в интерактивном режиме, вам необходимо зарегистрироватьTextWatcher, Но попытка изменить текст внутри наблюдателя создает дальнейшие обращения к наблюдателю. Мой хак - временно удалить наблюдателя, когда я хочу изменить текст, и перерегистрировать его сразу после

    mEditText.addTextChangedListener(new TextWatcher() {
        @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
        @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
        @Override public void afterTextChanged(Editable editable) {
            mEditText.removeTextChangedListener(this);
            mEditText.setText(//TODO change whatever you like here);
            mEditText.setSelection(editable.length()); //moves the pointer to end
            mEditText.addTextChangedListener(this);
        }
25

public class SampleActivity extends Activity {
    TextWatcher tt = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final EditText et = (EditText) findViewById(R.id.editText1);
        final TextView tv = (TextView) findViewById(R.id.textView1);
        tt = new TextWatcher() {
           public void afterTextChanged(Editable s){
                et.setSelection(s.length());
           }
           public void beforeTextChanged(CharSequence s,int start,int count, int after){} 
           public void onTextChanged(CharSequence s, int start, int before, int count) {
               et.removeTextChangedListener(tt);
               et.setText(et.getText().toString().replace("A", "C"));
               et.addTextChangedListener(tt);
           }
       };
       et.addTextChangedListener(tt);
   }
}
Я получаю сообщение об ошибке компиляции в вызовахet.removeTextChangedListener(tt), Жалуется чтоtt не может быть инициализирован. Вы можете избежать этого, просто заменивthis заtt.
et заменяет "a" с "c" но он перевернут, он добавляет символы в начале поля Issam Zoli
Может быть, для этого нужен ET.setSelection (s.length ()); где-то !! Issam Zoli

Похожие вопросы