一、上篇文章有写BaseActivity,为什么还要来一个AppAcitvity?
实际开发过程中,虽然有会抽一个BaseActivity继承来使用,但BaseAcitvity只是对一些通用的抽取设计。
还有一些UI的通用设计等等,如果都写在BaseActivity里面,个人感觉BaseAcitvity太过复杂,代码不易看懂。
也不好维护,也背离了Java的单一职责的原则。所以还得有一个AppActivity。
二、AppActivity还能干啥?有统一业务UI相关的,我个人就放在这里面。
1.标题的初始化
2.进度页面的初始化(加载中、加载失败、加载成功、空数据这些等等)
三、AppAcitvity的代码,关于BaseAcitivty、DefTitleBar 去看我之前文章。
/**
* App的Activity
*/
public abstract class AppActivity extends BaseActivity {
/**
* 自定义标题
*/
protected DefTitleBar mTitleBar;
/**
* 加载页面
*/
protected LoadingAndRetryManager mLoadingLayout;
@Override
protected void initTitle() {
if (isNeedTitle()) {
mTitleBar = DefTitleBar.Builder.create(this, getTitleParent())
.setLeftRes(R.drawable.ic_title_back)
.setBgColor(getResources().getColor(R.color.colorPrimary))
.builder();
setTitle(mTitleBar);
}
}
/**
* Title作用在哪个View上
*/
protected ViewGroup getTitleParent() {
return null;
}
/**
* 是否有Title,默认是有的
*
* @return
*/
protected boolean isNeedTitle() {
return true;
}
/**
* 设置Title
*/
protected abstract void setTitle(DefTitleBar titleBar);
@Override
protected final void initView(Bundle savedInstanceState) {
// 加载页面的初始化
mLoadingLayout = LoadingAndRetryManager.generate(getTargetView(), new OnLoadingAndRetryListener() {
@Override
public void setRetryEvent(View retryView) {
setViewClick(retryView);
}
@Override
public void setDataErrorEvent(View errorDataView) {
setViewClick(errorDataView);
}
@Override
public int generateEmptyLayoutId() {
int emptyLayoutId = getEmptyLayoutId();
if (emptyLayoutId != -1) {
return emptyLayoutId;
}
return super.generateEmptyLayoutId();
}
@Override
public void setEmptyEvent(View emptyView) {
setEmptyEventClick(emptyView);
}
});
mLoadingLayout.showContent();
initView(mContentView, savedInstanceState);
}
/**
* 网络失败点击重新调用
*/
protected void onRetryClick() {
initNet();
}
/**
* 空页面处理事件
*
* @param emptyView
*/
protected void setEmptyEventClick(View emptyView) {
}
/**
* 空布局
*/
protected int getEmptyLayoutId() {
return -1;
}
/**
* 设置错误View的点击
*
* @param retryView
*/
private void setViewClick(View retryView) {
if (retryView != null) {
retryView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onRetryClick();
}
});
}
}
/**
* 加载布局作用在哪个View上
*/
protected Object getTargetView() {
return mContentView;
}
/**
* 初始化子类的View
*/
protected abstract void initView(View view, Bundle savedInstanceState);
}
四、使用AppActivity,效率肯定有所提升。
/**
* 开发页面
*/
public class ChildActivity extends AppActivity {
@Override
protected Object getLayout() {
// 自己去写布局
return null;
}
@Override
protected void setTitle(DefTitleBar titleBar) {
titleBar.setTitle("我是标题");
}
@Override
protected void initView(View view, Bundle savedInstanceState) {
}
}
五、补充,关于LoadingAndRetryManager我用的是鸿洋大神的写的,自己去百度。
源码地址:https://gitee.com/lfwen/TitleDemo