用FragmentTabHost管理Fragment,实现页面切换

来源:互联网 发布:很污的网络用词 编辑:程序博客网 时间:2024/05/11 20:37

现在大多数的应用的主页面都有点类似新浪微博的主页面,下方是一个导航栏,点击导航栏会进行页面的切换。从技术实现上来说,这并不复杂,可以有很多方法来实现,比如用radiogroup和fragment配合就可以。可是这样我们并不是我们想要的,因为这样写需要我们自己写不少逻辑去控制。俗话说不会偷懒的程序员不是好程序员,所以我们希望系统给我们提供一个可以对Fragment管理的类,我们不用关心太多的逻辑,只需要做好相应Fragment的显示,那样是不是很爽。值得高兴的是系统真的提供了这样一个类:FragmentTabHost。可是它存在一个缺陷,到后面再说,我们先简单看一下它的用法。

它的用法和别的控件一样需要我们先在布局文件中声明,如下:


接下来我们就需要创建导航栏单个item的通用布局,如下:
这里只是简单的演示一下用法,Fragment布局里面就一个TextView用于在切换的时候区分,这里就不贴代码了。
接下来我们在activity里面进行设置就可以了,代码如下:
简单看一下效果:

ok~效果出来了  上面说过它存在一个缺陷,缺陷就是每次FragmentTabHost切换fragment时会重新调用onCreateView()重新绘制UI。假如我们在onCreateView()中有网络操作,在切换的时候也会重复进行,这样当然不是我们希望的。当然也有解决方法,我们可以在onCreateView()方法里面做一些处理:
private View rootView;// 缓存Fragment view  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,      Bundle savedInstanceState)  {    Log.i(TAG, "onCreateView");    if (rootView == null)    {      rootView = inflater.inflate(R.layout.fragment_home, null);      //假如有网络操作建议放在这里面,避免重复加载   }    // 缓存的rootView需要判断是否已经被加过parent,如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。    ViewGroup parent = (ViewGroup) rootView.getParent();    if (parent != null)    {      parent.removeView(rootView);    }    return rootView;  }
到这也算是比较圆满了,可是大家想过没有,假如它内部能够通过hide和show来管理fragment多好,这样我们就不用做以上处理,而且在效率上也会高了很多。下面我就贴一个重写了的FragmentTabHost它的内部就是通过hide和show来隐藏和显示Fragment的,而且它的用法和系统的完全一样。大家可以导入到自己的项目中,直接使用。

最后我们来想一想,用它来管理Fragment的好处是什么。比如说,需求发生了改变,我们需要添加或删除Fragment的时候,我们只需要,在Class数组添加或删除相应的Fragment的calss,别的逻辑都不需要改变就可以达到我们想要的效果。ok~就写这么多了。


2 0
原创粉丝点击