现在的Android开发中,Activity和Fragment都是必不可少的,正如上篇博客所写,我们都会封装一个基类的Activity来做一些公共基础的操作。对于Fragment应用的越发广泛,在实际开发中,我们也应当封装一个基础的Fragment,让逻辑代码更加清晰,也利于后期的维护和可读性。
直接上代码,首先是几个变量:
protected View mRoot;
protected Unbinder mRootUnBinder;
protected boolean mIsFirstInitData = true;
其中,mRoot是Fragment的布局,mRootUnbinder看他的类型就知道,是因为引入了ButterKnife,所以定义这个Unbinder变量,用于后面的控件绑定。而boolean型变量mIsFirstInitData,顾名思义,用于判断是否是第一次初始化数据,用于避免每次加载时都刷新数据,详细看后面的代码。
接下来是onAttach方法:
@Override
public void onAttach(Context context) {
super.onAttach(context);
//初始化参数
initArgs(getArguments());
}
这里只有一个initArgs方法,用于初始化参数,具体实现由子类复写,做具体的业务逻辑。
然后是onCreateView方法:
@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;
}
在这里面先做判断,当前mRoot如果为null,则通过getContentLayoutId方法拿到布局文件的Id,然后通过inflater拿到view,再调用initWidget方法初始化控件,在initWidget方法中调用ButterKnife框架,详细代码后面贴。且将拿到的root赋值给mRoot。若mRoot不为null,则尝试将mRoot从其父控件移出,最后将mRoot返回。
接下来是onViewCreated方法:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if(mIsFirstInitData) {
mIsFirstInitData = false;
onFirstInit();
}
//当View创建完成后初始化数据
initData();
}
这里首先就用到了mIsFirstInitData这个变了,如果是第一次加载,则调用onFirstInit这个方法,进行第一次的一些必要的初始化操作,然后调用initData方法进行初始化数据。当然,这两个初始化的方法也都是交由子类复写,做具体需要的业务逻辑。
最后在定义一个返回值是boolean类型的onBackPressed方法:
public boolean onBackPressed() {
return false;
}
如果有子类重写了onBackPressed这个方法,对返回键做了具体的自己的处理,那么就返回true,这个用于Activity中返回键处理时判断子Fragment有没有已经多返回键做了具体处理,具体方法上篇Activity中有写。
最后贴上完整代码:
public abstract class Fragment extends android.support.v4.app.Fragment {
protected View mRoot;
protected Unbinder mRootUnBinder;
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();
}
/**
* 初始化相关参数
*
* @param bundle 参数Bundle
* @return 如果参数初始化正确返回true,错误返回false
*/
protected void initArgs(Bundle bundle) {
}
/**
* 得到当前界面的资源文件Id
*
* @return 资源文件Id
*/
protected abstract int getContentLayoutId();
/**
* 初始化控件
*/
protected void initWidget(View root) {
mRootUnBinder = ButterKnife.bind(this, root);
}
/**
* 初始化首次数据
*/
protected void onFirstInit() {
}
/**
* 初始化数据
*/
protected void initData() {
}
/**
* 返回按键触发时调用
*
* @return 返回true代表我已处理返回逻辑,Activity不用自己Finish
* 返回false代表我没有处理逻辑, Activity自己走自己的逻辑
*/
public boolean onBackPressed() {
return false;
}
}
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/22303.html
微信打赏
支付宝打赏
感谢您对作者rick的打赏,我们会更加努力! 如果您想成为作者,请点我