您的位置:首页 > 移动开发 > Android开发

fragment使用心得

2016-07-07 10:58 281 查看
        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如何来走他们的流程。下面上代码,里边是我使用的方式:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">
   <FrameLayout
       android:id="@+id/fragment_container_rl"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="1" />
   <include layout="@layout/widget_divider_e5_h" />
   <FrameLayout
       android:id="@+id/layout_bottom"
       android:layout_width="match_parent"
       android:layout_height="@dimen/px98dp"
       android:layout_alignParentBottom="true">
       <RadioGroup
           android:id="@+id/tab_menu_rg"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="@color/white"
           android:orientation="horizontal">
           <RadioButton
               android:id="@+id/main_rb"
               style="@style/Tab_Menu_Index"
               android:checked="true"
               android:drawableTop="@drawable/selector_tab_menu_main"
               android:text="@string/easy_education" />
           <RadioButton
               android:id="@+id/chat_rb"
               style="@style/Tab_Menu_Index"
               android:drawableTop="@drawable/selector_tab_menu_chat"
               android:text="@string/chat" />
           <RadioButton
               android:id="@+id/contacts_rb"
               style="@style/Tab_Menu_Index"
               android:drawableTop="@drawable/selector_tab_menu_chatbook"
               android:text="@string/contacts" />
           <RadioButton
               android:id="@+id/user_center_rb"
               style="@style/Tab_Menu_Index"
               android:drawableTop="@drawable/selector_tab_menu_my"
               android:text="@string/user_center" />
       </RadioGroup>
     </LinearLayout>    
  </FrameLayout>
</LinearLayout>
上面是一个典型的tab布局。activity中的关键切换代码如下:
//监听radio点击事件切换fragment
mTabMenuRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
           @Override
           public void onCheckedChanged(RadioGroup group, int checkedId) {
               switch (checkedId) {
                   case R.id.main_rb:
                       replaceFragment(mMainFragment, TAG_MAIN);
                       break;
                   case R.id.chat_rb:
                       replaceFragment(mChatFragment, TAG_CHAT);
                       break;
                   case R.id.contacts_rb:
                       replaceFragment(mContactsFragment, TAG_CONTACTS);
                       break;
                   case R.id.user_center_rb:
                       replaceFragment(mUserCenterFragment, TAG_USER_CENTER);
                       break;
            }
         }
      });
replace方法:
   /**
    * 用tempFragment替代当前Fragment, 并给tempFragment增加一个tag,以便下次调用,不用新建
    *
    * @param tag
    * @param fragment 设定文件
    */
   private void replaceFragment(Fragment fragment, String tag) {
       currentFragment = fragment;
       boolean isAdd = true;
       Fragment tempFragment = getSupportFragmentManager().findFragmentByTag(tag);
       if (tempFragment == null) {
           tempFragment = fragment;
           isAdd = false;
      }
       FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
       transaction.replace(R.id.fragment_container_rl, tempFragment, tag);
       if (!isAdd) {
           transaction.addToBackStack(tag);
      }
       transaction.commitAllowingStateLoss();
   }
主要介绍一下replace里边的fragment切换逻辑,这里replace 一个fragement之后会把fragment添加到fragment管理栈中,fragment栈不知道,自己百度去。而在新建一个fragmentz以前我们都会通过添加到管理栈时为fragment唯一标记的tag获取回来,如果没有找到才会创建一个新的fragment。        在使用过程中是不是发现为什么每次切换回来发现数据是空的,这是因为view要重绘,所以需要你吧数据从新赋值才能达到需要的效果。说错的地方就请见谅了,水平有限,呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android