mvp+recycleView+cardView+customToolbar+按密度适配之一

来源:互联网 发布:vb中cancel是什么意思 编辑:程序博客网 时间:2024/06/05 22:47

首先导入本地的适配maven

这个适配方案,改自张鸿洋大神的autolayout,在使用大神的适配方案的时候,发现相同分辨率不同密度的手机,会出现不适配的情况。所以改为按密度适配。能适配更多手机。已上传maven库:

compile ‘com.zitech.common:autolayout:1.0.1’

添加用到的依赖

compile 'com.android.support:appcompat-v7:23.4.0'compile 'com.android.support:design:23.4.0'compile 'com.android.support:cardview-v7:23.4.0'compile 'com.android.support:recyclerview-v7:23.4.0'compile 'com.jakewharton:butterknife:8.0.1'

baseActivity设计

创建common包
首先创建抽象类BaseAppCompatActivity,因为我们要适配,所以要继承AutoLayoutActivity,
因为不想每次都写oncreat等方法,我们开启一个页面无非就是加载数据,展示控件。所以这里写了几个抽象方法。

@Overrideprotected void onCreate(Bundle savedInstanceState){    super.onCreate(savedInstanceState);    //设置竖屏    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);   // setContentView()之前,初始化toolbar等操作    initToolbar();    ButterKnife.bind(this);    // setContentView()之后,初始化view    initViews(savedInstanceState);    // setContentView()之后,初始化数据    initData();}

然后写几个常用的方法,和一个加载框。

然后activity有两种情况,一种是有toolbar的,一种是不含toolbar,或者toolbar需要滑动的,so,再写两个抽象activity ,首先是BaseToolbarActivity:
关于toolbar的封装,请看Android ToolBar 的简单封装,我这里是另外一种方案。有些傻,也有点实用。

{    private ToolBarHelper mToolBarHelper;    public CustomToolBar toolbar;    @Override    protected void initToolbar()    {        mToolBarHelper = new ToolBarHelper(this, getLayoutId());        toolbar = mToolBarHelper.getToolBar();        setContentView(mToolBarHelper.getContentView());        setToolBar();        /*把 toolbar 设置到Activity 中*/        setSupportActionBar(toolbar);    }    /**     * Fill in layout id     *     * @return layout id     */    protected abstract int getLayoutId();    /**     * 自定义ToolBar的属性一些操作     */    public void setToolBar()    {        if (toolbar == null) return;        toolbar.setContentInsetsRelative(0, 0);        toolbar.setNavigationIcon(null);//      final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);//      upArrow.setColorFilter(getResources().getColor(), PorterDuff.Mode.SRC_ATOP);//      toolbar.setNavigationIcon(upArrow);    }}

然后是BaseNoBarActivity:

{    @Override    protected void initViews(Bundle savedInstanceState)    {    }    @Override    protected void initToolbar()    {        setContentView(getLayoutId());    }    /**     * Fill in layout id     *     * @return layout id     */    protected abstract int getLayoutId();    @Override    protected void initData()    {    }

ok,让ui切图的密度,配置适配

<meta-data
android:name="UI_density"
android:value="3.0"/>

然后写base modle ,base Presenter和base View

这三个其实可以有,可以没有,可以写一下通用的方法,比如退出的时候取消网络请求的回掉。。。

下面写登陆的mvp实现

我的包是这样的,这也是google的分包概念
这里写图片描述
然后写view:

    interface LoginView extends BaseView<LoginPresenter>    {        void setUsernameError();        void setPasswordError();        void setFaild(String str);        void jumpToHome();    }

view的状态有密码错误,用户名错误,登陆失败,成功后跳转这几种,所以写几个抽象方法,
而数据交互,也就是model,只有一个向服务其提交登陆信息的事件,所以Presenter要写这个方法,去和model通信:

    interface LoginPresenter extends BasePresenter    {        void validateCredentials(String username, String password);    }

model登陆呢,有这么几个情况:密码错误,户名错误,登陆失败,登陆成功,所以要写接口实现这几个方法

        void onUsernameError();        void onPasswordError();        void onSuccess();        void onFaild(String str);    }

但当然还有和服务器交互的部分:

     void login(String username, String password, OnLoginFinishedListener listener);

然后model的实现和presenter的实现:
这里写图片描述

这里写图片描述

这里写图片描述

然后 activity里实现loginview

public class LoginActivity extends BaseToolbarActivity implements LoginContract.LoginView{    @BindView(R.id.et_username)    EditText mEtUsername;    @BindView(R.id.et_password)    EditText mEtPassword;    @BindView(R.id.btn_login)    Button mBtnLogin;    private LoginContract.LoginPresenter presenter;    @Override    protected void initViews(Bundle savedInstanceState)    {        presenter = new LoginPresenterImpl(this);    }    @Override    protected void initData()    {    }    @Override    public void setUsernameError()    {        mEtUsername.setError(getString(R.string.tip_username_wrong));    }    @Override    public void setPasswordError()    {        mEtPassword.setError(getString(R.string.tip_password_wrong));    }    @Override    public void setFaild(String str)    {        Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();    }    @Override    public void jumpToHome()    {        skipActivity(MainActivity.class);    }    @Override    public void showProgress()    {        showLoading();    }    @Override    public void hideProgress()    {        hideLoading();    }    @Override    protected int getLayoutId()    {        return R.layout.activity_login;    }    @OnClick(R.id.btn_login)    public void onClick()    {        presenter.validateCredentials(mEtUsername.getText().toString().trim(), mEtPassword.getText().toString().trim());    }}

登陆页面写好了。

代码传送门

0 0
原创粉丝点击