fragment使用心得

        fragment已经流行了好几年了,现在来写一篇感觉有点多余。每每看到大家在使用的过程中,都忍不住出来吐槽一下,当然我没说你们使用的是错的。下面让我细细说来。

         fragment即碎片,他拥有类似activity的生命周期,如下图所示(图我就不画了,盗一下图):

onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图,每次使用replace方法进行fragment切换时都会调用,并重建view。
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()

与onAttach相对应,当Fragment与Activity关联被取消时调用

        这里我就不再重复网上其他网友写的很明白的问题了,我想重点给大家说明的问题是,使用replace切换fragment时,fragment的一个切换流程。简单点我们以一个首页tab切换的问题来说明fragment如何来走他们的流程。下面上代码,里边是我使用的方式:

 
 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:layout_width="match_parent"
  4.    android:layout_height="match_parent"
  5.    android:orientation="vertical">
  6.    <FrameLayout
  7.        android:id="@+id/fragment_container_rl"
  8.        android:layout_width="match_parent"
  9.        android:layout_height="0dp"
  10.        android:layout_weight="1" />
  11.    <include layout="@layout/widget_divider_e5_h" />
  12.    <FrameLayout
  13.        android:id="@+id/layout_bottom"
  14.        android:layout_width="match_parent"
  15.        android:layout_height="@dimen/px98dp"
  16.        android:layout_alignParentBottom="true">
  17.        <RadioGroup
  18.            android:id="@+id/tab_menu_rg"
  19.            android:layout_width="match_parent"
  20.            android:layout_height="match_parent"
  21.            android:background="@color/white"
  22.            android:orientation="horizontal">
  23.            <RadioButton
  24.                android:id="@+id/main_rb"
  25.                style="@style/Tab_Menu_Index"
  26.                android:checked="true"
  27.                android:drawableTop="@drawable/selector_tab_menu_main"
  28.                android:text="@string/easy_education" />
  29.            <RadioButton
  30.                android:id="@+id/chat_rb"
  31.                style="@style/Tab_Menu_Index"
  32.                android:drawableTop="@drawable/selector_tab_menu_chat"
  33.                android:text="@string/chat" />
  34.            <RadioButton
  35.                android:id="@+id/contacts_rb"
  36.                style="@style/Tab_Menu_Index"
  37.                android:drawableTop="@drawable/selector_tab_menu_chatbook"
  38.                android:text="@string/contacts" />
  39.            <RadioButton
  40.                android:id="@+id/user_center_rb"
  41.                style="@style/Tab_Menu_Index"
  42.                android:drawableTop="@drawable/selector_tab_menu_my"
  43.                android:text="@string/user_center" />
  44.        </RadioGroup>

  45.      </LinearLayout>    

      </FrameLayout>

  46. </LinearLayout>

上面是一个典型的tab布局。activity中的关键切换代码如下:

 
 
  1. //监听radio点击事件切换fragment

  2. mTabMenuRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

  3.            @Override
  4.            public void onCheckedChanged(RadioGroup group, int checkedId) {
  5.                switch (checkedId) {
  6.                    case R.id.main_rb:
  7.                        replaceFragment(mMainFragment, TAG_MAIN);
  8.                        break;
  9.                    case R.id.chat_rb:
  10.                        replaceFragment(mChatFragment, TAG_CHAT);
  11.                        break;
  12.                    case R.id.contacts_rb:
  13.                        replaceFragment(mContactsFragment, TAG_CONTACTS);
  14.                        break;
  15.                    case R.id.user_center_rb:
  16.                        replaceFragment(mUserCenterFragment, TAG_USER_CENTER);
  17.                        break;
  18.                }
  19.            }
  20.        });

replace方法:

  
  
  1.    /**
  2.     * 用tempFragment替代当前Fragment, 并给tempFragment增加一个tag,以便下次调用,不用新建
  3.     *
  4.     * @param tag
  5.     * @param fragment 设定文件
  6.     */
  7.    private void replaceFragment(Fragment fragment, String tag) {
  8.        currentFragment = fragment;
  9.        boolean isAdd = true;
  10.        Fragment tempFragment = getSupportFragmentManager().findFragmentByTag(tag);
  11.        if (tempFragment == null) {
  12.            tempFragment = fragment;
  13.            isAdd = false;
  14.        }
  15.        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  16.        transaction.replace(R.id.fragment_container_rl, tempFragment, tag);
  17.        if (!isAdd) {
  18.            transaction.addToBackStack(tag);
  19.        }
  20.        transaction.commitAllowingStateLoss();
  21.    }

主要介绍一下replace里边的fragment切换逻辑,这里replace 一个fragement之后会把fragment添加到fragment管理栈中,fragment栈不知道,自己百度去。而在新建一个fragmentz以前我们都会通过添加到管理栈时为fragment唯一标记的tag获取回来,如果没有找到才会创建一个新的fragment。

        在使用过程中是不是发现为什么每次切换回来发现数据是空的,这是因为view要重绘,所以需要你吧数据从新赋值才能达到需要的效果。

说错的地方就请见谅了,水平有限,呵呵。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值