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

首先导入本地的适配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等方法,我们开启一个页面无非就是加载数据,展示控件。所以这里写了几个抽象方法。

@Override
protected 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值