Не подключаются несколько событий onTextChanged на каждый EditText

208
17 января 2019, 13:00

Когда я пытаюсь присвоить одно событие onTextChanged к одному EditText, чтобы значение из этого EditText записалось в другой EditText, всё работает хорошо. Но когда я делаю три onTextChanged на каждый из трёх EditText отдельно каждому, приложение вылетает. Что делать? Заранее спасибо

package com.romatopotatos.physicalformulas;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.text.TextWatcher;
import android.text.Editable;
public class FDvigActivity extends Activity {
    EditText editS;
    EditText editV;
    EditText editT;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_f_dvig);
        editS = (EditText) findViewById(R.id.sEdit);
        editV = (EditText) findViewById(R.id.vEdit);
        editT = (EditText) findViewById(R.id.tEdit);
        editS.addTextChangedListener(new TextWatcher(){
            @Override
            public void beforeTextChanged(CharSequence ch, int i, int i1, int i2){
            }
            @Override
            public void onTextChanged(CharSequence ch, int i, int i1, int i2){
                String s = editS.getText().toString();
                editT.setText(s);
                editV.setText(s);
            }
            @Override
            public void afterTextChanged(Editable ed){
            }
        });
        editV.addTextChangedListener(new TextWatcher(){
            @Override
            public void beforeTextChanged(CharSequence ch, int i, int i1, int i2){
            }
            @Override
            public void onTextChanged(CharSequence ch, int i, int i1, int i2){
                String v = editV.getText().toString();
                editT.setText(v);
                editS.setText(v);
            }
            @Override
            public void afterTextChanged(Editable ed){
            }
        });
        editS.addTextChangedListener(new TextWatcher(){
            @Override
            public void beforeTextChanged(CharSequence ch, int i, int i1, int i2){
            }
            @Override
            public void onTextChanged(CharSequence ch, int i, int i1, int i2){
                String t = editT.getText().toString();
                editS.setText(t);
                editV.setText(t);
            }
            @Override
            public void afterTextChanged(Editable ed){
            }
        });
    }
}

В приложении при вводе значения в одно поле должны меняться значения в других полях. Но пока я сделал так, чтобы при вводе значения в одно поле, это же значение появлялось в других полях. Но при попытке ввести текст приложение не отвечает, экранная клавиатура на некоторое время "застревает"

Answer 1

Да похоже на зацикливание: editV.setText(t) вызывает у editV метод onTextChanged, который вызывает onTextChanged у двух остальных, и по экспоненте. Помимо этого у вас в коде ошибка - editS.addTextChangedListener вы добавляете два раза, второй раз вы должны на editT добавить слушатель.

Нужно добавить три boolean переменные stopV, stopS, stopT для блокировки зацикливания. Код проверил, работает!

public class MainActivity extends AppCompatActivity {
EditText editS;
EditText editV;
EditText editT;
boolean stopV;
boolean stopS;
boolean stopT;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editS = (EditText) findViewById(R.id.editS);
    editV = (EditText) findViewById(R.id.editT);
    editT = (EditText) findViewById(R.id.editV);
    stopS=true;
    stopV=true;
    stopT=true;
    editS.addTextChangedListener(new TextWatcher(){
        @Override
        public void beforeTextChanged(CharSequence ch, int i, int i1, int i2){
        }
        @Override
        public void onTextChanged(CharSequence ch, int i, int i1, int i2) {
            if (stopS) {
                String sw = editS.getText().toString();
                stopT = false;
                stopV=false;
                editT.setText(sw);
                editV.setText(sw);
            }
            stopS=true;
        }
        @Override
        public void afterTextChanged(Editable s) {

        }

    });
    editV.addTextChangedListener(new TextWatcher(){
        @Override
        public void beforeTextChanged(CharSequence ch, int i, int i1, int i2){
        }
        @Override
        public void onTextChanged(CharSequence ch, int i, int i1, int i2) {
            if (stopV) {
                stopS = false;
                stopT = false;
                String v = editV.getText().toString();
                editT.setText(v);
                editS.setText(v);
            }
            stopV=true;
        }
        @Override
        public void afterTextChanged(Editable ed){

        }
    });
    editT.addTextChangedListener(new TextWatcher(){
        @Override
        public void beforeTextChanged(CharSequence ch, int i, int i1, int i2){
        }
        @Override
        public void onTextChanged(CharSequence ch, int i, int i1, int i2){
            if (stopT) {
                stopV=false;
                stopS=false;
                String t = editT.getText().toString();
                editS.setText(t);
                editV.setText(t);
            }
            stopT=true;
        }
        @Override
        public void afterTextChanged(Editable ed){
        }
    });
}

Xml:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="mihail_lagarnikov.ru.shadowtest1.MainActivity">

<EditText
    android:id="@+id/editV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:ems="10"
    android:inputType="textPersonName"
    android:text="Name"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
<EditText
    android:id="@+id/editS"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:ems="10"
    android:inputType="textPersonName"
    android:text="Name"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/editV" />
<EditText
    android:id="@+id/editT"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:ems="10"
    android:inputType="textPersonName"
    android:text="Name"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/editS" />

READ ALSO
Программный отступ margin

Программный отступ margin

нужно отступить от нижнего правого угла, но если в view посадить bottom и right любое значение, то ничего не происходит, а отступ идет, только если...

159
Иннициализация логина юзера

Иннициализация логина юзера

Ситуация следующая: Юзер логинится в личный кабинет, переходя по рестам в логах могу отловить его логинВ одном из классов, метод SecurityUtils

130
Как скопировать данные удаленной бд и сохранить их локально?

Как скопировать данные удаленной бд и сохранить их локально?

Дооброго времени суток)У меня есть бд (MySQL) на хостинге

167