通常我们会创建一系列的Base基类,如BaseManager、BaseApi、BaseActivity、BaseFragment、BaseAdapter等等。创建Base的好处多多,如规范代码逻辑、减少重复代码、方便复用。。。
言归正传,我们开始。
BaseFragmentActivity
1、创建一个抽象类BaseFragmentActivity继承AppCompatActivity。
2、定义初始化相关的抽象方法:
/**
* 设置布局
* @return layout id
*/
protected abstract int setLayoutId();
/**
* 初始化bundle
*/
protected abstract void initBundle();
/**
* 初始化界面
**/
protected abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
在生命周期中onCreate中依次调用
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(setLayoutId());
initBundle();
initView();
initData();
ctx = this;
}
3、实现作为一个容器的价值——管理碎片Fragment
(1)定义变量:
private final int container = R.id.container; //在ids.xml中定义
/**
* back fragment list.
*/
private ArrayList<BaseFragment> fragments;
/**
* current fragment.
*/
private BaseFragment fragment;
(2)向Activity容器中首次加入碎片
/**
* 向Activity中首次加入碎片.
*
* @param fragment 新碎片的实例.
* @param addToBackStack 是否将该碎片加入返回堆栈.
*/
public void addContent(BaseFragment fragment, boolean addToBackStack) {
initFragments();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(container, fragment);
if (addToBackStack) {
ft.addToBackStack(null);
} else {
removePrevious();
}
ft.commitAllowingStateLoss();
getSupportFragmentManager().executePendingTransactions();
fragments.add(fragment);
setFragment();
}
/**
* 初始化碎片列表.
*/
private void initFragments() {
if (fragments == null) {
fragments = new ArrayList<>();
}
}
/**
* 设置当前的碎片.
*/
private void setFragment() {
if (fragments != null && fragments.size() > 0) {
fragment = fragments.get(fragments.size() - 1);
} else {
fragment = null;
}
}
(3)替换容器中的碎片
/**
* 替换Activity容器中的碎片.
*
* @param fragment
* @param addToBackStack
*/
public void replaceContent(BaseFragment fragment, boolean addToBackStack) {
initFragments();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(container, fragment);
if (addToBackStack) {
ft.addToBackStack(null);
} else {
removePrevious();
}
ft.commitAllowingStateLoss();
getSupportFragmentManager().executePendingTransactions();
fragments.add(fragment);
setFragment();
}
(4)碎片回退操作
/**
* 回退到上一个碎片展示.
*/
public void removeContent() {
removePrevious();
setFragment();
getSupportFragmentManager().popBackStackImmediate();
}
/**
* 从堆栈中移除上一个
*/
private void removePrevious() {
if (fragments != null && fragments.size() > 0) {
fragments.remove(fragments.size() - 1);
}
}
/**
* 退回到首个碎片展示
*/
public void backTopFragment() {
if (fragments != null && fragments.size() > 1) {
removeContent();
backTopFragment();
}
}
4、Activity堆栈管理
onCreate中push
HActivityManager.getScreenManager().pushActivity(this);
onDestory中pop
HActivityManager.getScreenManager().popActivity(this);
[注]这里用到的HActivityManager封装自定义的核心库模块中,mavenCentral地址提供给大家:
implementation 'com.redapplenet:HuicentCoreLibrary:1.0.3-rc3'
BaseFragment
作为碎片的基类,相比容器的基类就简单很多了。
直接贴代码
package com.huicent.library.bases;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Fragment基础类
*
* @author wu
* @date 2018/5/7
*/
public abstract class BaseFragment extends Fragment {
protected Activity mActivity;
protected Context mContext;
/**
* 布局id
*
* @return
*/
protected abstract int setLayoutId();
/**
* 初始化界面
*
* @param view
* @param savedInstanceState
*/
protected abstract void initView(View view, Bundle savedInstanceState);
/**
* 初始化数据
*
* @param savedInstanceState
*/
protected abstract void initData(Bundle savedInstanceState);
@Override
public void onAttach(Context context) {
super.onAttach(context);
mActivity = (Activity) context;
mContext = context;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(setLayoutId(), container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view, savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData(savedInstanceState);
}
}
总结
BaseFragmentActivity主要实现了管理Fragment碎片相关方法,以及提供了一些初始化的对外方法,这里面不涉及业务,不涉及UI。下一章中我将继承BaseFragmentActivity,实现公共UI和公共业务。