андроїд редактор текстових змін


115

Я знаю трохи про те, TextWatcherале це спрацьовує з кожним персонажем, який ви вводите. Я хочу слухача, який запускається щоразу, коли користувач закінчує редагування. Це можливо? Також TextWatcherя отримую екземпляр, Editableале мені потрібен екземпляр EditText. Як я можу це отримати?

EDIT : друге питання важливіше. Будь ласка, відповідайте на це.


1
спробуйте додати слухача фокусу, коли редактор змінює фокус editText, це означає, що користувач розпочав його редагувати, а коли editText втратить фокус, це означає, що редагування закінчено
Houcine

Відповіді:


214

По-перше, ви можете побачити, чи закінчив користувач редагування тексту, якщо EditTextвтрачає фокус, чи користувач натискає кнопку "Зроблено" (це залежить від вашої реалізації та від того, що підходить вам найкраще). По-друге, ви не можете отримати EditTextекземпляр TextWatcherлише в тому випадку, якщо ви оголосили його EditTextяк об'єкт екземпляра. Незважаючи на те, що ви не повинні редагувати EditTextвсередині, TextWatcherоскільки це не безпечно.

Редагувати:

Щоб мати змогу включити EditTextекземпляр у свою TextWatcherреалізацію, слід спробувати щось подібне:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

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

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

Зауважте, що вищенаведений зразок може мати деякі помилки, але я просто хотів показати вам приклад.


17

Мене непокоїло, що впровадження слухача для всіх моїх полей EditText вимагає від мене некрасивого, багатослівного коду, тому я написав нижчий клас. Може бути корисним для кожного, хто натрапив на це.

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

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

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

Зараз реалізація слухача трохи чистіша.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

Що стосується того, як часто він спрацьовує, можна, можливо, здійснити перевірку для запуску потрібного коду //Do stuffпісля заданого а


Це дуже добре працює для мене, економить багато рядків коду! Ви геній!
huypham99

12

Усі, хто використовує ButterKnife . Ви можете використовувати:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6

Я це зробив, використовуючи AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

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

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

3
 myTextBox.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) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
На завершення є одне непотрібне
Говард

2

TextWatcherне працювало для мене, оскільки воно продовжувало стріляти по кожному EditTextі псувати значення один одному.

Ось моє рішення:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

Отже, використовуючи getChildAt(xx)метод, ви можете отримати будь-який елемент у ListViewта отримати окремий елемент за допомогою findViewById. І це дасть найсвіжіше значення.


1

Наскільки я можу подумати про це, є лише два способи це зробити. Як ви можете знати, що користувач закінчив писати слово? Або на фокус втрачено, або натиснувши кнопку "ОК". На мій погляд, ви не можете знати, що користувач натиснув останнього символу ...

Тож зателефонуйте onFocusChange(View v, boolean hasFocus)або додайте до неї кнопку та слухач кліків.


0

Метод Watcher запускається з кожного вводу символів. Отже, я створив цей код на основі методу onFocusChange:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

Для його використання просто зателефонуйте так:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

Ви можете ігнорувати функцію comS, замінивши! ComS (dat.s, "" + EdTe.getText ()) на! Рівну функцію. Однак однакова функція сама деякий час працює неправильно під час виконання.

Слухач onChange запам'ятає старі дані EditText під час введення фокусу користувача, а потім порівняє нові дані, коли користувач втратить фокус або перейде до іншого вводу. Якщо порівнювати стару струну з не такою ж новою, вона заповнює роботу.

Якщо у вас є лише 1 EditText, тоді вам потрібно буде зробити функцію ClearFocus, зробивши Ultimate Secret Transparent Micro EditText 😸 поза вікнами 😽, і попросити зосередитись на ньому, а потім приховати клавіатуру за допомогою диспетчера методів імпорту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.