Взаимное заполнение EditText-ов

130
02 сентября 2019, 19:30

Задача чтоб, при изменении первого editText'а изменялся 2-ой, а при изменении 2-го - первый.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etNum2 = (EditText) findViewById(R.id.editText2);
etNum = (EditText) findViewById(R.id.editText);


etNum.addTextChangedListener(new TextWatcher() {
    @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) {
        if(s.toString().length()>0){
            h.removeCallbacksAndMessages(null); // Cancels previous call
            h.postDelayed(new Runnable() {
                @Override
                public void run()
                {
                   num1 = Float.parseFloat(etNum.getText().toString());
                        vivod = ((1/Float.parseFloat(r))*Float.parseFloat(k))*num1;

                    String str = String.valueOf(vivod);
                    etNum2.setText(str);

                }
            }, 10); // 1 second
        }
        else{
        }
    }
});

Пока у меня получилось сделать только так, если пытаюсь изменить второе, просто в обоих нули и их не изменить никак. Пробовал создать новый листнер, ничего не получилось, надеюсь кто-то мне подскажет. Спасибо

Answer 1

TextWatcher реагирует на любое изменение текста. Если просто повесить на оба - то они зацикливаются, бесконечно изменяя друг друга и реагируя на эти же изменения.
Нужно добавить условия, когда листенер должен сработать, а когда нет.
Например, проверить в фокусе ли наш EditText (оба сразу не могут быть в фокусе):

etNum.addTextChangedListener(new TextWatcher() {
    @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) {
        if (!etNum.hasFocus())
            return;
        if (s.toString().length() > 0) {
            num1 = Float.parseFloat(etNum.getText().toString());
            vivod = ((1/Float.parseFloat(r))*Float.parseFloat(k))*num1;
            String str = String.valueOf(vivod);
            etNum2.setText(str);
        }
    }
});
READ ALSO
Выдает исключение Exception in Application constructor

Выдает исключение Exception in Application constructor

Решил погуглить и посикать примеры, где в ячуйку таблицы TableView добавляется кнопка, и когда начал запускать проект у себя постоянно выбрасывает...

106
Firebase onDisconnect и RemovalValue выдают ошибку (Java, Android)

Firebase onDisconnect и RemovalValue выдают ошибку (Java, Android)

При нажатии на выход из аккаунта приложение показывает ошибку в строке: currentrefonDisconnect()

126
Вопрос по Minecraft Protocol

Вопрос по Minecraft Protocol

Тут почитал wikivg/Protocol и попробовал составить простенький сервер

106
rdf4j как преобразовать tuples в json

rdf4j как преобразовать tuples в json

Проблема следующая: При парсинге sparql запроса я получаю упрощённое ast и мне нужно его передать в стороннюю библиотеку для дальнейшей обработки,...

124