https://medium.com/@cervonefrancesco/model-view-presenter-android-guidelines-94970b430ddf说恢复模型中的状态,而不是演示者。如果我有一个非常简单的“模型”,比如说将文本视图更新为打开或关闭的二进制切换,该怎么办?创建一个具有单个字符串值的模型Toggle类似乎有些过分。
另一个选择是将捆绑包从我的活动传递到onSaveInstanceState内的演示者中的相应方法中,并类似于onCreate进行还原。 但是文章还说我们应该避免在演示者中有android依赖项。
最后,我尝试使用Icepick,但这不起作用:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Icepick.restoreInstanceState(this, savedInstanceState);
(Button) findViewById(R.id.btn).setOnClickListener(this);
presenter.onCreate();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Icepick.saveInstanceState(this, outState);
}
@Override
public void onClick(View view) {
presenter.onButtonClicked();
}
@Override
public void updateState(String state) {
tv.setText(state);
}
MainPresenter.java
public class MainPresenter {
private MainView mainView;
@State String toggle;
@Inject
public MainPresenter(MainView mainView) {
this.mainView = mainView;
}
void onCreate() {
mainView.updateState(toggle);
}
void onButtonClicked() {
mainView.updateState(toggle.equals("on") ? "off" : "on");
}
}
我有什么选择?如果必须使用模型方法,我可以为我的案例看到一个例子吗?
答案 0 :(得分:0)
如果您使用注释处理来维持状态,则没有Icepick.saveInstanceState(this, outState)
(您无法在演示者中调用)的情况下,它将不会自动将数据填充到演示者中。
@State String toggle;
此行应出现在活动中。演示者中有一种方法可以通过切换请求数据。像这样:
@State String toggle = "off"; //default value
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Icepick.restoreInstanceState(this, savedInstanceState);
(Button) findViewById(R.id.btn).setOnClickListener(this);
presenter.onCreate();
presenter.setState(toggle)
}
您可以将此值存储为演示者中的全局变量,并据此确定应用程序流程。