Android MVVM 中另一个字段的更改更新字段
Updating fields on change of another field in Android MVVM
我想实现,比方说温度单位转换器。我想使用 android MVVM 和数据绑定来执行此操作,但我不知道如何操作。
我有一个由三个 EditText 字段组成的片段:Celsius、Fahrenheit、Kelvin。更改其中一个后,其余的应该会自动更新。在没有数据绑定的情况下,我将 TextWatcher 设置为每个字段,并在 onTextChanged 中执行所有验证和转换逻辑并设置其他字段的值。在 beforeTextChanged 中,我删除了对其他字段的侦听器,并在 afterTextChanged 中再次设置它们,以避免在一个字段更新时出现无限循环,触发更新另一个字段的 TextWatcher 等等...
这是我如何在没有数据绑定的情况下实现这一目标的简化代码。
celsiusEditTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
fahrenheitEditText.removeTextChangedListener(fahrenheitEditTextWatcher);
kelvinEditText.removeTextChangedListener(kelvinEditTextWatcher);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
double celsius = String.valueOf(celsiusEditText.getText());
double fahrenheit = celsiusToFahrenheit(celsius);
double kelvin = celsiusToKelvin(celsius)
fahrenheitEditText.setText(Double.toString(fahrenheit));
kelvinEditText.setText(Double.toString(kelvin));
}
@Override
public void afterTextChanged(Editable s) {
fahrenheitEditText.addTextChangedListener(fahrenheitEditTextWatcher);
kelvinEditText.addTextChangedListener(kelvinEditTextWatcher);
}
};
感谢任何帮助。
我做了一个非常简单的解决方案。在这里,设 A 和 B 是 EditText,当用户输入更改文本时需要同步。同时更新各自对应的LiveData:
Activity
package marabillas.loremar.edittextmvvm;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private AViewModel viewModel;
private AListener aListener = new AListener();
private BListener bListener = new BListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText a = findViewById(R.id.aEdit);
final EditText b = findViewById(R.id.bEdit);
viewModel =
new ViewModelProvider(getViewModelStore(), new ViewModelProvider.NewInstanceFactory()).get(AViewModel.class);
a.addTextChangedListener(aListener);
b.addTextChangedListener(bListener);
viewModel.isFieldsSynced = false;
viewModel.aEditData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
if (!a.getText().toString().equals(s)) {
a.setText(s);
}
if (viewModel.isFieldsSynced) {
viewModel.isFieldsSynced = false;
} else {
viewModel.isFieldsSynced = true;
b.setText("A changed");
}
}
});
viewModel.bEditData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
if (!b.getText().toString().equals(s)) {
b.setText(s);
}
if (viewModel.isFieldsSynced) {
viewModel.isFieldsSynced = false;
} else {
viewModel.isFieldsSynced = true;
a.setText("B changed");
}
}
});
}
class AListener implements 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) {
System.out.println("A text Changed");
viewModel.aEditData.setValue(s.toString());
}
}
class BListener implements 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) {
System.out.println("B text changed");
viewModel.bEditData.setValue(s.toString());
}
}
}
视图模型
package marabillas.loremar.edittextmvvm;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class AViewModel extends ViewModel {
public boolean isFieldsSynced = false;
public MutableLiveData<String> aEditData = new MutableLiveData<>();
public MutableLiveData<String> bEditData = new MutableLiveData<>();
}
第一个if
逻辑是判断A是否要更新。第二个if
逻辑是判断B是否要更新。这里 A 是 EditText,其文本由用户输入更改。 B 是 EditText 的文本需要与 A 同步。这对逻辑确保 EditText 和 LiveData 只更新一次。
我想实现,比方说温度单位转换器。我想使用 android MVVM 和数据绑定来执行此操作,但我不知道如何操作。 我有一个由三个 EditText 字段组成的片段:Celsius、Fahrenheit、Kelvin。更改其中一个后,其余的应该会自动更新。在没有数据绑定的情况下,我将 TextWatcher 设置为每个字段,并在 onTextChanged 中执行所有验证和转换逻辑并设置其他字段的值。在 beforeTextChanged 中,我删除了对其他字段的侦听器,并在 afterTextChanged 中再次设置它们,以避免在一个字段更新时出现无限循环,触发更新另一个字段的 TextWatcher 等等...
这是我如何在没有数据绑定的情况下实现这一目标的简化代码。
celsiusEditTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
fahrenheitEditText.removeTextChangedListener(fahrenheitEditTextWatcher);
kelvinEditText.removeTextChangedListener(kelvinEditTextWatcher);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
double celsius = String.valueOf(celsiusEditText.getText());
double fahrenheit = celsiusToFahrenheit(celsius);
double kelvin = celsiusToKelvin(celsius)
fahrenheitEditText.setText(Double.toString(fahrenheit));
kelvinEditText.setText(Double.toString(kelvin));
}
@Override
public void afterTextChanged(Editable s) {
fahrenheitEditText.addTextChangedListener(fahrenheitEditTextWatcher);
kelvinEditText.addTextChangedListener(kelvinEditTextWatcher);
}
};
感谢任何帮助。
我做了一个非常简单的解决方案。在这里,设 A 和 B 是 EditText,当用户输入更改文本时需要同步。同时更新各自对应的LiveData:
Activity
package marabillas.loremar.edittextmvvm;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private AViewModel viewModel;
private AListener aListener = new AListener();
private BListener bListener = new BListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText a = findViewById(R.id.aEdit);
final EditText b = findViewById(R.id.bEdit);
viewModel =
new ViewModelProvider(getViewModelStore(), new ViewModelProvider.NewInstanceFactory()).get(AViewModel.class);
a.addTextChangedListener(aListener);
b.addTextChangedListener(bListener);
viewModel.isFieldsSynced = false;
viewModel.aEditData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
if (!a.getText().toString().equals(s)) {
a.setText(s);
}
if (viewModel.isFieldsSynced) {
viewModel.isFieldsSynced = false;
} else {
viewModel.isFieldsSynced = true;
b.setText("A changed");
}
}
});
viewModel.bEditData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
if (!b.getText().toString().equals(s)) {
b.setText(s);
}
if (viewModel.isFieldsSynced) {
viewModel.isFieldsSynced = false;
} else {
viewModel.isFieldsSynced = true;
a.setText("B changed");
}
}
});
}
class AListener implements 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) {
System.out.println("A text Changed");
viewModel.aEditData.setValue(s.toString());
}
}
class BListener implements 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) {
System.out.println("B text changed");
viewModel.bEditData.setValue(s.toString());
}
}
}
视图模型
package marabillas.loremar.edittextmvvm;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class AViewModel extends ViewModel {
public boolean isFieldsSynced = false;
public MutableLiveData<String> aEditData = new MutableLiveData<>();
public MutableLiveData<String> bEditData = new MutableLiveData<>();
}
第一个if
逻辑是判断A是否要更新。第二个if
逻辑是判断B是否要更新。这里 A 是 EditText,其文本由用户输入更改。 B 是 EditText 的文本需要与 A 同步。这对逻辑确保 EditText 和 LiveData 只更新一次。