我在我的项目中使用了mvp模式来进行开发,封装了BaseActivity,由于是mvp的模式所以会和普通的不一样,但是一些普通的Activity是不需要persenter来进行解耦,
我们先看看普通的基类,
UIActivity
public abstract class UiActivity extends AppCompatActivity {
public Context mContext;
private Toolbar mToolbar;
private LinearLayout mTitleLayout;
private TextView mTextTitle;
private Unbinder mUnbinder;
public RxManager mRxManager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 把actvity放到application栈中管理
// AppManager.getAppManager().addActivity(this);
beforeView();
setContentView(getLayout());
mUnbinder = ButterKnife.bind(this);
mContext = this;
mRxManager = new RxManager();
ACacheUtil.getInstance(this);
this.setToolBar();
this.init();
}
private void beforeView() {
setStatusBar();
}
/**
* 设置状态栏
*/
public void setToolBar() {
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mTextTitle = (TextView) findViewById(R.id.toolbar_title);
mTitleLayout = (LinearLayout) findViewById(R.id.title_layout);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}
/**
* 设置toolbar显示与隐藏
*
* @param vis
*/
public void setTitleLayoutVis(int vis) {
if (mTitleLayout != null) {
mTitleLayout.setVisibility(vis);
}
}
/**
* 设置标题
*
* @param title
*/
public void setTitle(String title) {
if (mTextTitle != null) {
mTextTitle.setText(title);
}
}
/**
* 获取标题控件
*
* @return
*/
public TextView getTitleView() {
if (mTextTitle != null) {
return mTextTitle;
}
return null;
}
public void setToolBackgroundRes(int resid){
if (mToolbar!=null){
mToolbar.setBackgroundResource(resid);
}
}
public void setToolBackgroundColor(int color){
if (mToolbar!=null){
mToolbar.setBackgroundColor(color);
}
}
/**
* 设置返回按钮的样式
*/
public void setBackIcon(int icon) {
if (mToolbar != null) {
mToolbar.setNavigationIcon(icon);
mToolbar.setNavigationOnClickListener(NavListener);
}
}
/**
* 设置返回按钮的样式
*/
public void setBackIcon(Drawable icon) {
if (mToolbar != null) {
mToolbar.setNavigationIcon(icon);
mToolbar.setNavigationOnClickListener(NavListener);
}
}
private View.OnClickListener NavListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
};
/**
* 得到菜单。显示到UI
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
int menuRes=getMenuRes();
if (menuRes!=0){
getMenuInflater().inflate(menuRes,menu);
}
return true;
}
/**
* 设置menu的子控件显示与隐藏
* @param menu
* @return
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
onOptionsMenu(menu);
return super.onPrepareOptionsMenu(menu);
}
/**
* 设置menu点击事件
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
onOptionsSelected(item);
return super.onOptionsItemSelected(item);
}
/**
* 暴露给外部的函数
* 设置menu点击事件
* @param item
*/
public void onOptionsSelected(MenuItem item) {
}
/**
* 暴露给外部的函数
* 设置menu的子控件显示与隐藏
* @param menu
*/
public void onOptionsMenu(Menu menu) {
}
/**
* 设置菜单Menu
*/
protected abstract int getMenuRes();
/**
* 设置状态栏
*/
protected abstract void setStatusBar();
/**
* 设置layout
*/
public abstract int getLayout();
/**
* 初始化
*/
public abstract void init();
@Override
protected void onDestroy() {
super.onDestroy();
if (mUnbinder != null) {
mUnbinder.unbind();
}
if (mRxManager != null) {
mRxManager.clear();
}
ACacheUtil.clear();
// AppManager.getAppManager().finishActivity(this);
}
/**
* 通过Class跳转界面
*/
public void start(Class<?> cls) {
start(cls, null);
}
/**
* 含有Bundle,通过Class跳转界面
*/
public void start(Class<?> cls, Bundle bundle) {
Intent intent = new Intent();
intent.setClass(this, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
}
/**
* 通过Class跳转界面,有返回值时调用
**/
public void startActivityForResult(Class<?> cls, int requestCode) {
startActivityForResult(cls, null, requestCode);
}
/**
* 含有Bundle通过Class跳转界面,有返回值时调用
**/
public void startActivityForResult(Class<?> cls, Bundle bundle,
int requestCode) {
Intent intent = new Intent();
intent.setClass(this, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
}
我在这个类中使用了ButterKnife和RxManager这个两个需要的可以保留,不需要的可以直接删除,不影响代码的使用,既然是封装,那么怎么可能去每个Activity里面去写标题呢,所以我在其中直接加入Toolbar,然后暴露给子类的一些操作标题栏的方法,在继承UiActivity的时候,在子类中记得要使用include来引用该布局。
这是Toolbar的布局,你可以自己写,也可以使用我的。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/title_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="?attr/selectableItemBackground"
android:clickable="false"
android:foreground="?attr/selectableItemBackground"
android:gravity="center"
android:text="首页"
android:textColor="#FFFFFF"
android:textSize="20sp" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
</LinearLayout>
我们知道Toolbar右侧是不能直接添加图片或者文字的,那么我们就使用Menu来给他添加图片和文字。getMenuRes()这个方法子类继承时会返回一个menu给他,然后在onPrepareOptionsMenu(Menu menu)和onCreateOptionsMenu(Menu menu)这两个方法中去设置menu的显示和menu的点击事件,当然了如果你不需要右侧的按钮,那么你就不用管getMenuRes()这个方法,他会自己返回0。
BaseActivity
public abstract class BaseActivity<T extends BasePresenter, E extends BaseModel> extends UiActivity {
public T mPresenter;
public E mModel;
@Override
public int getLayout() {
return this.getLayoutId();
}
@Override
public void init() {
mPresenter = TUtil.getT(mContext,0);
mModel= TUtil.getT(mContext,1);
if(mPresenter!=null){
mPresenter.mContext=mContext;
}
this.initView();
this.initPresenter();
}
//获取布局文件
public abstract int getLayoutId();
//简单页面无需mvp就不用管此方法即可,完美兼容各种实际场景的变通
public abstract void initPresenter();
public abstract void initView();
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null){
mPresenter.onDestroy();
}
}
}
该类是继承自UiActivity,使这个类能使用到Toolbar和其他的一下共同的东西,如果有不明白的地方可以私信或留言给我。