• 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


  • 相关阅读:
    235. Lowest Common Ancestor of a Binary Search Tree
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    108. Convert Sorted Array to Binary Search Tree
    win7+iis7.5+asp.net 安装IIS 遇到的一些问题
    创建一个简单的WCF程序
    ROW_NUMBER() OVER函数的基本用法
    input type="file"
    Nightmare
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879551.html
Copyright © 2020-2023  润新知