每次旋转设备时都会显示吐司

时间:2019-03-03 13:01:03

标签: android-architecture-components

在我的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());
    }
}

这是我的ViewModel:

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;
    }
}

因此,当我单击活动调用方法onClickStart()上的按钮时 如果任何字段为空,则显示吐司。在活动调用方法中:

onChanged (String message)

好。很好。

但是问题是,当我在活动方法onChanged(String message)中旋转设备时,被称为 AGAIN ,结果显示吐司。每次旋转都会发生这种情况。 为什么?

1 个答案:

答案 0 :(得分:1)

这是预期的行为。如果要避免这种情况,则必须先设置message = ""并保持空白,然后再显示吐司。

一种更好的使用方式是事件包装器或SingleLiveEvent

强烈建议您阅读此article。这就解释了您面对这个问题的原因以及您的详细选择。