android-architecture-components - 每次旋转设备时都会显示 Toast
问题描述
在我的 Android 应用程序中,我使用 AAC。
这是我的活动:
public class AddTraderActivity extends AppCompatActivity {
AddTraderViewModel addTraderViewModel;
private static final String TAG = AddTraderActivity.class.getName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AddTraderActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.add_trader_activity);
binding.setHandler(this);
init();
}
private void init() {
ViewModelProvider viewViewModelProvider = ViewModelProviders.of(this);
addTraderViewModel = viewViewModelProvider.get(AddTraderViewModel.class);
Observer<String> () {
@Override
public void onChanged (String message){
Debug.d(TAG, "onChanged: message = " + message);
Toast.makeText(AddTraderActivity.this, message, Toast.LENGTH_LONG).show();
}
});
}
public void onClickStart() {
EditText baseEditText = findViewById(R.id.baseEditText);
EditText quoteEditText = findViewById(R.id.quoteEditText);
addTraderViewModel.doClickStart(baseEditText.getText().toString(), quoteEditText.getText().toString());
}
}
这是我的视图模型:
public class AddTraderViewModel extends AndroidViewModel {
private MutableLiveData<String> messageLiveData = new MutableLiveData<>();
private static final String TAG = AddTraderViewModel.class.getName();
public AddTraderViewModel(@NonNull Application application) {
super(application);
}
public void doClickStart(String base, String quote) {
Debug.d(TAG, "doClickStart: ");
if (base.trim().isEmpty() || quote.trim().isEmpty()) {
String message = getApplication().getApplicationContext().getString(R.string.please_input_all_fields);
messageLiveData.setValue(message);
return;
}
}
public LiveData<String> getMessageLiveData() {
return messageLiveData;
}
}
因此,当我单击 Activity 调用方法上的按钮时,onClickStart()
如果任何字段为空,则显示 toast。在活动调用方法中:
onChanged (String message)
好的。它工作正常。
但问题是,当我在活动方法中旋转设备时,再次onChanged(String message)
调用它,结果显示吐司。每次轮换都会发生这种情况。为什么?
解决方案
这是预期的行为。如果你想避免这种情况,你必须message = ""
在展示吐司之前设置并保持一个空检查。
使用它的更好方法是 Event Wrapper 或SingleLiveEvent
强烈推荐你阅读这篇文章。这解释了您面临此问题的原因以及您的详细选择。
推荐阅读
- visual-studio-code - 通过Microsoft Store安装vs code而不是下载.exe时,如何添加“Open with vs code”?
- javascript - Java List 元素在锚标记内未定义
- python - 将 Excel 公式转换为 Python Pandas 代码
- javascript - 显示空白的传单地图
- docker - 如何将 chrome 节点连接到 docker 中的 selenium 网格
- entity-framework-core - 我可以按规定的顺序运行 IDataSeedContributor 实现吗?
- azure - 动态传递 ARM 参数作为 customscriptextension 参数
- php - 在 PHP MySQL 中使用查询嵌套 IF
- ios - 为什么规定的到期日期与证书的到期日期不同
- c# - SQL Server SELECT MAX 并添加 1