场景:使用Fragment实现切页。

类结构:

  

一:Activity

Activity中使用getSupportFragmentManager().beginTransaction()来填充一个Fragment(管理用的FragmentA)

Activity部分代码:

FragmentA fragment = FragmentA.newInstant(null);
getSupportFragmentManager().beginTransaction().add(R.id.f_tab_fragment,fragment).commit();

XML:

            <FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_above="@+id/f_tab_fragment"
android:layout_height="match_parent"/> <FrameLayout
android:id="@+id/f_tab_fragment"
android:layout_width="match_parent"
android:layout_height="52dp"
android:layout_alignParentBottom="true"/>

二:FragmentA

加载一个主FragmentA,作为管理其它子叶片FragmentX。

现在比如有两个子叶片FragmentB、FragmentC.

FragmentA 使用FragmentManager和FragmentTransaction管理FragmentB、FragmentC的切换

FragmentA代码:

public class FragmentA extends BaseFragment {

    private static final String TAB_HOME = com.timediffproject.module.home.MyMainFragment.class.getName();

    private static final String TAB_TEST = com.timediffproject.module.home.TestFragment.class.getName();

    private BaseFragment mLastShowFragment;

    private static TabFragment fragment;

    public static TabFragment newInstant(Bundle bundle){
if (fragment == null){
fragment = new TabFragment();
fragment.setArguments(bundle);
}
return fragment;
} @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTabInfo(); } private void initTabInfo(){
FragmentManager fm = getFragmentManager();
if (fm == null){
return;
}
FragmentTransaction ft = fm.beginTransaction(); BaseFragment home = (BaseFragment) fm.findFragmentByTag(TAB_HOME);
if (home != null){
ft.hide(home);
} BaseFragment test = (BaseFragment) fm.findFragmentByTag(TAB_TEST);
if (test != null){
ft.hide(test);
} ft.commit(); } @Nullable
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab,container,false);
} @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_change_home).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchTo(TAB_HOME,null);
}
});
view.findViewById(R.id.btn_change_test).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchTo(TAB_TEST,null);
}
});
switchTo(TAB_HOME,null);
} //切换Fragment的方式(FragmentB、FragmentC)
//tab为Fragment的类名(如:FragmentB.class.getName())
//R.id.fl_container是在Activity的布局里,不是在FragmentA的布局里
private void switchTo(String tab, Bundle bundle){ //初始化管理Fragment的类
FragmentManager fm = getFragmentManager();
if (fm == null){
return;
}
FragmentTransaction ft = fm.beginTransaction(); //从FragmentManager里寻找类名为tab的Fragment
BaseFragment fragment = (BaseFragment)fm.findFragmentByTag(tab);
if (fragment == null){
fragment = (BaseFragment) Fragment.instantiate(getActivity(),tab);
fragment.setArguments(bundle);
ft.add(R.id.fl_container,fragment,tab);
}else{
ft.show(fragment);
}
//隐藏现在正显示的Fragment
if (mLastShowFragment != null) {
ft.hide(mLastShowFragment);
}
//记录最后点击的Fragment
mLastShowFragment = fragment; ft.commitAllowingStateLoss(); } }

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="52dp"> <Button
android:id="@+id/btn_change_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换home"
/> <Button
android:id="@+id/btn_change_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换test"
/> </LinearLayout>

三:FragmentX(FragmentB、FragmentC)

子页的逻辑根据具体业务自己定义,实现与一般Fragmeng一样

例如:

public class TestFragment extends BaseFragment {

    @Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_test,container,false);
} @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
} }

到这里,就可以简单的实现-用底部Tab切换Fragment实现切页的功能

附图:

   

PS:实现过程中出现的错误

  java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

正确方式: 有关的fragment的初始化布局应该加上false,与父类布局建立关系。

原因:不加的话这个inflater出来的view系统会绑定一个未知父类,这时候当你把这个fragment又作为子页绑定给Activity或者另一个fragment时,就会出现以上错误。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//这里正确的写法是:
//return inflater.inflate(R.layout.fragment_test,container,false);
return inflater.inflate(R.layout.fragment_test,container);
}

最新文章

  1. 隐式意图启动一个Activity
  2. 学习笔记:CSS3的filter属性
  3. 材价看板(1)- 如何建立你的第一个kanban,看看这些暴露的问题你们有没有?
  4. UVA 10252
  5. Android之线程回掉更新ui
  6. Tomcat安装后启动一闪而过
  7. Java字符串之性能优化
  8. [Effective C++ --015]在资源管理类中提供对原始资源的访问
  9. 单独启动tomcat
  10. Android AlarmManager实现不间断轮询服务
  11. 201521123101 《Java程序设计》第14周学习总结
  12. ajax分页借鉴
  13. Python基础语法总结
  14. 盖茨基金会:如何使用Python拯救生命
  15. java打印实心10*10正方形, 空心10*10正方形
  16. Windows 8.1 GetVersionEx返回6.2.9200 的问题!
  17. [SQL Server]从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
  18. 初探Asp.net请求机制原理 1
  19. maven 发布打包部署 命令
  20. 【实战项目】【FLEX】#900 实现拖控件功能

热门文章

  1. LeetCode之小孩分糖果
  2. CSS3 稳固而知新: 居中
  3. chrome扩展(浏览器插件)开发实用教程
  4. UML类图详解_泛化关系
  5. jquery的基本api
  6. libubox组件(2)——blob/blobmsg (转载 https://segmentfault.com/a/1190000002391970)
  7. LeetCode447. Number of Boomerangs
  8. 第一百九十节,jQuery,编辑器插件
  9. Python Numpy ValueError: data type must provide an itemsize
  10. JS常用的方法总结