介绍
Fragment 的出现一方面是为了缓解 Activity 任务过重的问题,另一方面是为了处理在不同屏幕上 UI 组件的布局问题。
Fragment 拥有和 Activity 一致的生命周期,它和 Activity 一样被定义为 Controller 层的类。 它将屏幕分解为多个「Fragment(碎片)」,但它又不同于 View,它干的实质上就是 Activity 的事情,负责控制 View 以及它们之间的逻辑。
将屏幕碎片化为多个 Fragment 后,其实 Activity 只需要花精力去管理当前屏幕内应该显示哪些 Fragments,这是一种组件化的思维。
封装BaseFragment基类
/**
* Fragment基类
* Created by XP on 2016/1/9.
*/
public abstract class BaseFragment extends Fragment {
protected abstract void initViews();
protected abstract int provideLayoutId();
protected View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(provideLayoutId(), container, false);
ButterKnife.bind(this, rootView);
initViews();
return rootView;
}
}
使用静态工厂方法newInstance(...)来获取Fragment实例
public static Communication newInstance(String s) {
Communication communication = new Communication();
Bundle bundle = new Bundle();
bundle.putString("type", s);
communication.setArguments(bundle);
return communication;
}
避免错误操作导致Fragment的视图重叠
在add或者replace的时候,调用含有TAG参数的那个方法,之后再add相同TAG的Fragment的话,之前的会被替换掉,也就不会同时出现多个相同的Fragment了。
判断一个页面该使用Fragment还是Activity
如果后一个页面不需要用到前一个页面的太多数据,推荐用Activity展示,否则最好用Fragment( 当然这也不是绝对的)。例如SplashActivity和MainActivity没有太多的耦合度,此时可以分成两个Activity。
Fragment的通信
在Fragment中调用Activity中的方法
Fragment可以通过·getActivity()·方法来获得Activity的实例,然后就可以调用一些Activity的方法。
在Activity中调用Fragment中的方法
activity也可以获得一个fragment的引用,从而调用fragment中的方法。获得fragment的引用要用FragmentManager,之后可以调用findFragmentById() 或者 findFragmentByTag()。
Fragment与Fragment之间的通信
首先在一个Fragment中可以得到与它相关联的Activity,然后再通过这个Activity去获取另外一个Fragment的实例,这样就实现了不同Fragment之间的通信。
接口回调
可以在Fragment类中定义一个接口,并在它所属的Activity中实现该接口。Fragment在它的onAttach()方法执行期间捕获该接口的实现,然后就可以调用接口方法,以便跟Activity通信。
参考:
https://www.zhihu.com/question/39662488
https://www.zhihu.com/question/38100871
http://www.cnblogs.com/smyhvae/p/4000390.html