zoukankan      html  css  js  c++  java
  • Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html

    如新浪微博下面的标签切换功能,我以前也写过一篇博文(http://www.cnblogs.com/tiantianbyconan/archive/2012/02/24/2366237.html),可以实现,用的是TabHost。但是android发展比较迅速,TabHost这玩意现在已经被弃用了,虽说用现在也能用,但是被弃用的东西还是少用为妙。

    官方有个FragmentTabHost这么一个替代品,于是试了一下,发现每次切换tab,都会调用onCreateView()方法,控件被重新加载,也就是说你从tab1切换到别的tab后,再切换回来,tab1的状态并没有保存,重新加载了控件。

    搞了半天,暂时没有好的解决办法(有朋友知道解决办法的话,希望联系我,赐教下哈)

    于是,怒了,自己实现一个吧- -

     

    先来看看整个demo的结构:

    TabAFm到TabEFm都是Fragment,并且每个Fragment对应一个布局文件。

    TabAFm.java:

     View Code

    如上述代码所示,TabAFm是一个Fragment,对应的布局文件是tab_a.xml,并实现了他的所有的生命周期回调函数并打印,便于调试

    tab_a.xml布局中有个EditText

    其他的Fragment大同小异,这里就不贴出代码了

     

    现在来看MainActivity:

     View Code

    MainActivity上述代码所示

    MainActivity是包含Fragment的Activity(也就是这里的5个Fragment)

    他继承了FragmentActivity(因为我这里用的是android-support-v4.jar)

    用一个List<Fragment>去维护5个Fragment,也就是5个tab

    main布局中有一个id为tab_content的FrameLayout,用来存放要显示的Fragment。底部有一个RadioGroup,用于tab的切换,如下:

     View Code

    现在回到MainActivity中,下面这个FragmentTabAdapter类是关键,是我自己编写的用于绑定和处理fragments和RadioGroup之间的逻辑关系

    FragmentTabAdapter tabAdapter = new FragmentTabAdapter(this, fragments, R.id.tab_content, rgs);

     

    现在看下FragmentTabAdapter:

     View Code

    这里解决Fragment切换重新加载布局的办法,用的是把几个Fragment全部Add,然后根据要显示的哪个Fragment设置show或者hide

    效果输出:

    10-10 11:55:41.168: INFO/System.out(18368): AAAAAAAAAA____onAttach      // 第一次进入,显示TabA
    10-10 11:55:41.168: INFO/System.out(18368): AAAAAAAAAA____onCreate
    10-10 11:55:41.168: INFO/System.out(18368): AAAAAAAAAA____onCreateView
    10-10 11:55:41.175: INFO/System.out(18368): AAAAAAAAAA____onActivityCreated
    10-10 11:55:41.179: INFO/System.out(18368): AAAAAAAAAA____onStart
    10-10 11:55:41.179: INFO/System.out(18368): AAAAAAAAAA____onResume
    10-10 11:55:44.980: INFO/System.out(18368): AAAAAAAAAA____onPause      // 从TabA切换到TabB(TabA调用onPause)
    10-10 11:55:44.980: INFO/System.out(18368): Extra---- 1 checked!!!
    10-10 11:55:44.996: INFO/System.out(18368): BBBBBBBBBBB____onAttach
    10-10 11:55:44.996: INFO/System.out(18368): BBBBBBBBBBB____onCreate
    10-10 11:55:44.996: INFO/System.out(18368): BBBBBBBBBBB____onCreateView
    10-10 11:55:45.004: INFO/System.out(18368): BBBBBBBBBBB____onActivityCreated
    10-10 11:55:45.004: INFO/System.out(18368): BBBBBBBBBBB____onStart
    10-10 11:55:45.004: INFO/System.out(18368): BBBBBBBBBBB____onResume
    10-10 11:55:52.062: INFO/System.out(18368): BBBBBBBBBBB____onPause      // 从TabB切换到TabC(TabB调用onPause)
    10-10 11:55:52.062: INFO/System.out(18368): Extra---- 2 checked!!!
    10-10 11:55:52.082: INFO/System.out(18368): CCCCCCCCCC____onAttach
    10-10 11:55:52.082: INFO/System.out(18368): CCCCCCCCCC____onCreate
    10-10 11:55:52.086: INFO/System.out(18368): CCCCCCCCCC____onCreateView
    10-10 11:55:52.090: INFO/System.out(18368): CCCCCCCCCC____onActivityCreated
    10-10 11:55:52.090: INFO/System.out(18368): CCCCCCCCCC____onStart
    10-10 11:55:52.090: INFO/System.out(18368): CCCCCCCCCC____onResume
    10-10 11:56:06.535: INFO/System.out(18368): CCCCCCCCCC____onPause      // 从TabC切换到TabB(TabC调用onPause)
    10-10 11:56:06.535: INFO/System.out(18368): BBBBBBBBBBB____onResume    // 从TabC切换到TabB(TabB调用onResume)
    10-10 11:56:06.535: INFO/System.out(18368): Extra---- 1 checked!!!

     

    好了,到此为止,我们已经用Fragment实现了类似TabHost的功能了,下面来看下各个Fragment之间的通信

    现在的情况是TabAFm中有个EditText,TabBFm中有个Button,MainActivity中有个变量“hello”

    要做的是,切换到TabA,输入“I'm TabA”,切换到B,点击Button后,Toast显示“hello I'm TabA”

    MainActivity中没什么好说的,就一个hello变量:

    public String hello = "hello ";

    TabAFm在布局文件tab_a.xml中加个EditText,设置个id就可以了

    TabBFm中:

     View Code
    // 获得绑定的FragmentActivity
    MainActivity activity = ((MainActivity)getActivity());

    通过getActivity()即可得到Fragment所在的FragmentActivity

     

    最终效果图:

    demo下载地址:http://pan.baidu.com/s/1wxsIX


  • 相关阅读:
    013.ES6 -对象字面量增强型写法
    012. ES6
    011. ES6 语法
    10. 9. Vue 计算属性的setter和getter 以及 计算属性的缓存讲解
    4. Spring MVC 数据响应方式
    3. SpringMVC 组件解析
    9. Vue 计算属性
    【洛谷 2984】给巧克力
    【洛谷 1821】捉迷藏 Hide and Seek
    【洛谷 1821】银牛派对Silver Cow Party
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879552.html
Copyright © 2011-2022 走看看