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要重绘,所以需要你吧数据从新赋值才能达到需要的效果。