基于谷歌todoapp的android mvp(一)
先看两个工程结构,一个是根据hongyang的讲解来学习的,另一个是问的同事仿照谷歌来写的大体上是相同的,先上一下代码,然后我再来说,这里我就直接按照谷歌的讲了,hongyang的大家去看就可以了先来看三个base:baseactivitypackage com.fanyafeng.todomvp;import android.os.Bundle;import android.widg
这是我文章讲解的项目地址点击这里移步到我的项目地址
先看两个工程结构,一个是根据hongyang的讲解来学习的,另一个是问的同事仿照谷歌来写的
大体上是相同的,先上一下代码,然后我再来说,这里我就直接按照谷歌的讲了,hongyang的大家去看就可以了
先来看三个base:
baseactivity
package com.fanyafeng.todomvp;
import android.os.Bundle;
import android.widget.TextView;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
public class BaseActivity extends AppCompatActivity implements View.OnClickListener {
protected Toolbar toolbar;
protected TextView toolbar_center_title;
protected boolean isShowToolbar = true;
protected boolean isSetNavigationIcon = true;
protected boolean isSetLogo = false;
protected boolean isShowEmail = true;
protected String title;
protected String centertitle;
protected String subtitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
}
@Override
protected void onResume() {
super.onResume();
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar_center_title = (TextView) findViewById(R.id.toolbar_center_title);
if (toolbar != null) {
if (isShowToolbar) {
setSupportActionBar(toolbar);
} else {
toolbar.setVisibility(View.GONE);
}
if (title != null && !title.equals("")) {
toolbar.setTitle(title);
} else {
toolbar.setTitle("");
}
if (subtitle != null && !subtitle.equals("")) {
toolbar.setSubtitle(subtitle);
}
if (isSetNavigationIcon) {
// 由于要兼容低版本,所以采用这个划杠的方法,需要自己根据需求替换图片
toolbar.setNavigationIcon(getResources().getDrawable(R.mipmap.ic_launcher));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
if (isSetLogo) {
//需要自己根据需求进行替换图片
toolbar.setLogo(getResources().getDrawable(R.mipmap.ic_launcher));
}
if (toolbar_center_title != null) {
if (centertitle != null && !centertitle.equals("")) {
toolbar_center_title.setText(centertitle);
} else {
toolbar_center_title.setText("");
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_base, menu);
// 默认隐藏setting按钮
if (toolbar != null) {
MenuItem menuItem = toolbar.getMenu().getItem(0);
if (menuItem != null) {
menuItem.setVisible(false);
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_settings:
break;
}
return super.onOptionsItemSelected(item);
}
}
这个base是我早期就封装的了,感觉用着很方便,前面的文章有详细讲解
再来看basePresenter
package com.fanyafeng.todomvp;
/**
* Author: fanyafeng
* Data: 16/12/5 17:09
* Email: fanyafeng@live.cn
*/
public interface BasePresenter {
void start();
}
这里的start是通用方法,初始化ui完成以后通知p进行数据请求等等,一会会详细讲解
还有一个baseview
package com.fanyafeng.todomvp;
/**
* Author: fanyafeng
* Data: 16/12/5 17:09
* Email: fanyafeng@live.cn
*/
public interface BaseView<T> {
void setPresenter(T presenter);
}
这里注入了一个p
再来看主要的了mainactivity
package com.fanyafeng.todomvp.main;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import com.fanyafeng.todomvp.R;
import com.fanyafeng.todomvp.BaseActivity;
import com.fanyafeng.todomvp.putao.PutaoActivity;
//需要搭配baseactivity,这里默认为baseactivity,并且默认Baseactivity为包名的根目录
public class MainActivity extends BaseActivity implements MainContract.View {
private Button btnPuTao;
private MainContract.Presenter mPresenter;
private MainPresenter mainPresenter;
@Override
public void setPresenter(MainContract.Presenter presenter) {
mPresenter = presenter;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里默认使用的是toolbar的左上角标题,如果需要使用的标题为中心的采用下方注释的代码,将此注释掉即可
title = getString(R.string.title_activity_main);
isSetNavigationIcon = false;
mainPresenter = new MainPresenter(this, this);
initView();
mainPresenter.start();
initData();
}
//初始化UI空间
private void initView() {
btnPuTao = (Button) findViewById(R.id.btnPuTao);
}
//初始化数据
private void initData() {
}
@Override
public void onClick(View v) {
super.onClick(v);
switch (v.getId()) {
case R.id.btnPuTao:
mainPresenter.startPutaoActivity();
break;
}
}
@Override
public void setPutaoText() {
btnPuTao.setText("我的首页");
}
@Override
public void startPutaoActivity(Intent intent) {
intent.putExtra("name", "name");
startActivity(intent);
}
}
这里实现了两个功能,一个是activity的跳转,一个是button文字的修改,主要是start的使用,如果仅仅是一个activity的跳转的话start基本可以不用,但是程序的可读性就不好了
再来看maincontract
package com.fanyafeng.todomvp.main;
import android.content.Context;
import android.content.Intent;
import com.fanyafeng.todomvp.BasePresenter;
import com.fanyafeng.todomvp.BaseView;
/**
* Author: fanyafeng
* Data: 16/12/5 17:12
* Email: fanyafeng@live.cn
*/
public interface MainContract {
interface View extends BaseView<Presenter> {
void startPutaoActivity(Intent intent);
void setPutaoText();
}
interface Presenter extends BasePresenter {
void startPutaoActivity();
}
}
这里把v和p的接口都抽到了这一个类里面,可读性大大增强,而且一目了然。
最后看一下p,逻辑处理
package com.fanyafeng.todomvp.main;
import android.content.Context;
import android.content.Intent;
import com.fanyafeng.todomvp.putao.PutaoActivity;
/**
* Author: fanyafeng
* Data: 16/12/5 17:19
* Email: fanyafeng@live.cn
*/
public class MainPresenter implements MainContract.Presenter {
private Context context;
private MainContract.View mView;
public MainPresenter(Context context, MainContract.View mView) {
this.context = context;
this.mView = mView;
}
@Override
public void start() {
mView.setPutaoText();
}
@Override
public void startPutaoActivity() {
Intent intent = new Intent(context, PutaoActivity.class);
mView.startPutaoActivity(intent);
}
}
学过java依赖注入的应该很好理解,p里面注入了v,v里面注入了p可以相互进行操作。
这里还要说一下我这没有model,model不是必须的,可以理解为简单工具类+一些相应操作方法
这里是简单说了一下,没有涉及到网络请求,列表数据,下文会讲解(
勘误:这里没有fragement,activity充当v,所以p的set方法在这里可以不用的)
更多推荐



所有评论(0)