注意了
需要使用ButterKnife进行初始化
BaseActivity:
public abstract class Activity extends AppCompatActivity {
protected PlaceHolderView mPlaceHolderView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在界面未初始化之前调用的初始化窗口
initWidows();
if (initArgs(getIntent().getExtras())) {
// 得到界面Id并设置到Activity界面中
int layId = getContentLayoutId();
setContentView(layId);
initBefore();
initWidget();
initData();
} else {
finish();
}
}
/**
* 初始化控件调用之前
*/
protected void initBefore() {
}
/**
* 初始化窗口
*/
protected void initWidows() {
}
/**
* 初始化相关参数
*
* @param bundle 参数Bundle
* @return 如果参数正确返回True,错误返回False
*/
protected boolean initArgs(Bundle bundle) {
return true;
}
/**
* 得到当前界面的资源文件Id
*
* @return 资源文件Id
*/
protected abstract int getContentLayoutId();
/**
* 初始化控件
*/
protected void initWidget() {
ButterKnife.bind(this);
}
/**
* 初始化数据
*/
protected void initData() {
}
@Override
public boolean onSupportNavigateUp() {
// 当点击界面导航返回时,Finish当前界面
finish();
return super.onSupportNavigateUp();
}
@Override
public void onBackPressed() {
// 得到当前Activity下的所有Fragment
@SuppressLint("RestrictedApi")
List<android.support.v4.app.Fragment> fragments = getSupportFragmentManager().getFragments();
// 判断是否为空
if (fragments != null && fragments.size() > 0) {
for (Fragment fragment : fragments) {
// 判断是否为我们能够处理的Fragment类型
if (fragment instanceof net.qiujuer.italker.common.app.Fragment) {
// 判断是否拦截了返回按钮
if (((net.qiujuer.italker.common.app.Fragment) fragment).onBackPressed()) {
// 如果有直接Return
return;
}
}
}
}
super.onBackPressed();
finish();
}
/**
* 设置占位布局
*
* @param placeHolderView 继承了占位布局规范的View
*/
public void setPlaceHolderView(PlaceHolderView placeHolderView) {
this.mPlaceHolderView = placeHolderView;
}
}
BaseFragment:
public abstract class Fragment extends android.support.v4.app.Fragment {
protected View mRoot;
protected Unbinder mRootUnBinder;
protected PlaceHolderView mPlaceHolderView;
// 标示是否第一次初始化数据
protected boolean mIsFirstInitData = true;
@Override
public void onAttach(Context context) {
super.onAttach(context);
// 初始化参数
initArgs(getArguments());
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mRoot == null) {
int layId = getContentLayoutId();
// 初始化当前的跟布局,但是不在创建时就添加到container里边
View root = inflater.inflate(layId, container, false);
initWidget(root);
mRoot = root;
} else {
if (mRoot.getParent() != null) {
// 把当前Root从其父控件中移除
((ViewGroup) mRoot.getParent()).removeView(mRoot);
}
}
return mRoot;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (mIsFirstInitData) {
// 触发一次以后就不会触发
mIsFirstInitData = false;
// 触发
onFirstInit();
}
// 当View创建完成后初始化数据
initData();
}
/**
* 初始化相关参数
*/
protected void initArgs(Bundle bundle) {
}
/**
* 得到当前界面的资源文件Id
*
* @return 资源文件Id
*/
@LayoutRes
protected abstract int getContentLayoutId();
/**
* 初始化控件
*/
protected void initWidget(View root) {
mRootUnBinder = ButterKnife.bind(this, root);
}
/**
* 初始化数据
*/
protected void initData() {
}
/**
* 当首次初始化数据的时候会调用的方法
*/
protected void onFirstInit() {
}
/**
* 返回按键触发时调用
*
* @return 返回True代表我已处理返回逻辑,Activity不用自己finish。
* 返回False代表我没有处理逻辑,Activity自己走自己的逻辑
*/
public boolean onBackPressed() {
return false;
}
/**
* 设置占位布局
*
* @param placeHolderView 继承了占位布局规范的View
*/
public void setPlaceHolderView(PlaceHolderView placeHolderView) {
this.mPlaceHolderView = placeHolderView;
}
}
PlaceHolderView:
/**
* 基础的占位布局接口定义
*
*/
public interface PlaceHolderView {
/**
* 没有数据
* 显示空布局,隐藏当前数据布局
*/
void triggerEmpty();
/**
* 网络错误
* 显示一个网络错误的图标
*/
void triggerNetError();
/**
* 加载错误,并显示错误信息
*
* @param strRes 错误信息
*/
void triggerError(@StringRes int strRes);
/**
* 显示正在加载的状态
*/
void triggerLoading();
/**
* 数据加载成功,
* 调用该方法时应该隐藏当前占位布局
*/
void triggerOk();
/**
* 该方法如果传入的isOk为True则为成功状态,
* 此时隐藏布局,反之显示空数据布局
*
* @param isOk 是否加载成功数据
*/
void triggerOkOrEmpty(boolean isOk);
}