use*_*145 5 mvp android android-context
我是新来的Android MVP Architecture.据我所研究,Presenter应该保持免于任何Android的东西,例如:不要使用getActivity或Context在演示者.我编写了以下代码,其中a BasePresenter是Presenter我将使用BaseView的所有类BaseActivity的父Activity类.接口是所有View类的父接口,class是所有类的父类.我有多个活动,需要Toast在我的所有活动中显示消息.所以我编写了如下代码.我不太确定使用getactivity演示者课程是否是一个好习惯.如果不是那么有人可以建议任何更好的方法吗?
BasePresenter类
public class BasePresenter<V extends BaseView> {
private V mView;
private Context mContext;
public void attachView(V view) {
mView = view;
mContext=mView.getActivity();
}
public void showToast(String msg) {
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
}
private Context getContext() {
return mContext;
}
public void detachView() {
mView = null;
}
}
Run Code Online (Sandbox Code Playgroud)
BaseView类
public interface BaseView {
AppCompatActivity getActivity();
}
Run Code Online (Sandbox Code Playgroud)
BaseActivity类
public class BaseActivity extends AppCompatActivity {
public AppCompatActivity getActivity() {
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
MainActivity类
public class MainActivity extends BaseActivity implements MainView {
MainPresenter basePresenter;
@Override
protected void onStart() {
super.onStart();
basePresenter = new MainPresenter();
basePresenter.attachView(this);
}
// some more codes here
switch (item.getItemId()) {
case R.id.about:
basePresenter.showToast("About is Clicked");
break;
case R.id.cart:
basePresenter.showToast("Cart is Clicked");
break;
case R.id.favs:
basePresenter.showToast("Favs is Clicked");
break;
case R.id.home:
basePresenter.showToast("Home is Clicked");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这不是一个好主意.您是Presenter(基础或其他)不应该了解Context,Activity,Toast或其他基于Android的内容.
视图
Presenter.主持人
View怎么做.因此,对于单击按钮和显示Toasts的示例,您需要一个类似于以下设置的设置:
这就是您的演示者与您的视图对话的方式.它将由活动实施.
public interface MainView {
void showToast(String message);
}
Run Code Online (Sandbox Code Playgroud)
BasePresenter几乎没有任何任务.只需绑定View界面即可.请注意,MainPresenter中的方法名称与"click"之类的内容不明确,以便将它们与View实现分开.
public class BasePresenter<V> {
protected V view;
public void attachView(V view) {
this.view = view;
}
}
public class MainPresenter extends BasePresenter<MainView> {
public void about() {
view.showToast("About was clicked");
}
public void cart() {
view.showToast("Cart was clicked");
}
}
Run Code Online (Sandbox Code Playgroud)
Activity实现了View接口.它负责将用户事件传递给Presenter并执行Presenter命令.
public class MainActivity extends AppCompatActivity implements MainView {
private MainPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new MainPresenter();
presenter.attachView(this);
Button about = findViewById(R.id.button_about);
about.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.about();
}
});
Button cart = findViewById(R.id.button_cart);
cart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.cart();
}
});
}
@Override
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
在此设置中,Presenter不再了解任何有关Android的内容(根本没有从框架中导入),并且您可以为其编写单元测试,该测试可以直接在没有Android依赖项的JVM上运行.
| 归档时间: |
|
| 查看次数: |
4276 次 |
| 最近记录: |