这是我文章讲解的项目地址点击这里移步到我的项目地址

先看两个工程结构,一个是根据hongyang的讲解来学习的,另一个是问的同事仿照谷歌来写的
仿照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方法在这里可以不用的)

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐