首先导入本地的适配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());
}
}
登陆页面写好了。