Когда я пытаюсь присвоить одно событие 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){
}
});
}
}
В приложении при вводе значения в одно поле должны меняться значения в других полях. Но пока я сделал так, чтобы при вводе значения в одно поле, это же значение появлялось в других полях. Но при попытке ввести текст приложение не отвечает, экранная клавиатура на некоторое время "застревает"
Да похоже на зацикливание: 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" />
Сборка персонального компьютера от Artline: умный выбор для современных пользователей