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()); }}
登陆页面写好了。
代码传送门
- mvp+recycleView+cardView+customToolbar+按密度适配之一
- Android recycleview+cardview
- Android 5.0+(RecycleView、CardView、Palette)
- RecycleView和CardView笔记(一)
- 瀑布流效果RecycleView+CardView
- Android 使用RecycleView和CardView
- Android之RecycleView和CardView
- eclipse 上使用recycleview,cardview的办法
- 5.0 recycleview 和cardview基本使用
- Recycleview 多布局添加和cardview使用
- MVP+Fresco+OKhttp+Retrofit+Recycleview
- 分辨率/密度适配
- 使用cardview和recycleview时碰到的一些问题
- 如果5.0环境,不能自动引入RecycleView CardView
- 关于eclipse中recycleview/cardview的引入(环境搭建)
- RecycleView和CardView的简单介绍和用法
- android像素密度适配
- OkHttp+MVP实现RecycleView显示数据
- underscore.js 源码中一些实用的工具方法
- linux内核4.2.x实现自定义系统调用
- 如何不用VPN就可以轻松访问谷歌浏览器
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory Android
- CentOS 6.3下PostgreSQL 的安装与配置
- mvp+recycleView+cardView+customToolbar+按密度适配之一
- Eclipse之properties文件编辑器中将Unicode码显示为翻译后的字符
- PHP请求远程地址设置超时时间
- 广告投放方式:CPC、CPM、CPA、CPS、CPT
- 视频编解码原理
- 将java project 打包成跨平台的jar包
- Unity5.x的GUIText被UI Text所取代--增加头文件UnityEngine.UI
- 安卓常用框架系列之butterknife
- Redis集群方案