首页 > 解决方案 > 每次旋转设备时都会显示 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)调用它,结果显示吐司。每次轮换都会发生这种情况。为什么?

标签: android-architecture-components

解决方案


这是预期的行为。如果你想避免这种情况,你必须message = ""在展示吐司之前设置并保持一个空检查。

使用它的更好方法是 Event Wrapper 或SingleLiveEvent

强烈推荐你阅读这篇文章。这解释了您面临此问题的原因以及您的详细选择。


推荐阅读