关于Fragment的基本用法总结

来源:互联网 发布:2017年云计算500强 编辑:程序博客网 时间:2024/05/22 16:52

本文章纯属踩坑后,百度,试验有效后总结的结果,仅供个人参考


一、fragment管理

activity动态加载fragment

加载fragment的布局不限,并不局限于FrameLayout

加载方法:(只有导入的fragment是v4包,才有getSupportFragmentManager()

        FragmentA fragment = new FragmentA();        getSupportFragmentManager().beginTransaction()                .add(R.id.XXX, fragment, "fragment")//                .addToBackStack("")  //加入回退栈                .commit;

或者

FragmentManager manager = getSupportFragmentManager();  FragmentTransaction transaction = manager.beginTransaction();  transaction.add(R.id.fragment_container, fragment, "fragment");  transaction.commit(); 

但是第二种方法要注意,导包须一致

import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;

而除了使用add方法,我们也可以使用replace方法添加fragment

FragmentA fragment = new FragmentA();getSupportFragmentManager().beginTransaction()        .replace(R.id.XXX, fragment,"fragment")        .commit();

addreplace的区别是:

add 是往container容器里堆加fragment Viewreplace是将container容器里之前添加的View全部清除,然后再添加当前fragment View

一定要记住,replace清除的是container的视图,而不是fragment实例, remove移除的才是fragment实例

add后期可以使用showhide操作,但是replace不可以,原因见①

③使用add,回滚时,fragment不会重新加载,曾经的操作痕迹还存在,使用replace回滚时,之前的fragment会重新加载,原因见①

使用add的时候还有一点需要注意的是,视图重叠的问题,记得设置背景色
addreplace 千万不要混合使用,否则会出错

在进行removehideshow之前要记得判断fragment.isAdded();下面的代码我就不提示了

移除fragment实例

        Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");        getSupportFragmentManager().beginTransaction()                .remove(fragment)                .commit();

隐藏fragment

        Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");        getSupportFragmentManager().beginTransaction()                .hide(fragment)                .commit();

显示fragment

        Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");        getSupportFragmentManager().beginTransaction()                .show(fragment)                .commit();

拓展:

在fragment里刷新(即从头加载fragment数据,且不影响后续的回退栈)

Fragment replaceFragment = getActivity().getSupportFragmentManager().findFragmentByTag("first_fragment");                         getActivity().getSupportFragmentManager().beginTransaction()                                .detach(replaceFragment)                                .attach(replaceFragment)                                .commit();

简单的讲,detach是销毁View,而不是fragment实例,attach是重建视图Viewattach后的视图会位于视图最前面,具体的可以自己去查看资料


二、回滚操作

最常用:依次回滚

    @Override    public void onBackPressed() {        if (getSupportFragmentManager().getBackStackEntryCount() <= 1) {    //这里是取出我们返回栈存在Fragment的个数            finish();        } else {    //取出我们返回栈保存的Fragment,这里会从栈顶开始弹栈            getSupportFragmentManager().popBackStack();        }    }

拓展:指定回滚

void popBackStack(String name, int flags);  
  • 参数string name是transaction.addToBackStack(String tag)中的tag值;

  • 至于int flags有两个取值:0或FragmentManager.POP_BACK_STACK_INCLUSIVE;

    • 当取值0时,表示除了参数一指定这一层之上的所有层都退出栈,指定的这一层为栈顶层;

    • 当取值POP_BACK_STACK_INCLUSIVE时,表示连着参数一指定的这一层一起退出栈;

退回栈顶:

while (getSupportFragmentManager().getBackStackEntryCount()>1) {       getSupportFragmentManager().popBackStackImmediate();}

三、重点来了,在fragment里面加载fragment 显示问题

1.显示不出来:

加载fragment的布局不要使用LinearLayout,不要使用LinearLayout,不要使用LinearLayout,重要的事情说三遍,否则很有可能加载的fragment显示不出来

2.显示不完全:在onCreateView使用方式一,不要使用方式二

    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // 方式一        View view = inflater.inflate(R.layout.XXX, container, false);         // 方式二//        View view = inflater.inflate(R.layout.XXX, null);        return view;    }

3.点击事件透传

①如果加载的fragment的布局为ScrollView,不会发生透传事件

②如果存在透传事件,在fragment的根布局加上android:clickable="true",即可简单粗暴的解决点击事件穿透的问题

4.获取回退栈中fragment的数量

方式一:activity如继承FragmentActivity,可通过getSupportFragmentManager().getBackStackEntryCount()判断activity中栈内已存的fragment的数量,不包括通过方式二加载进去的fragment(在fragment中加载子fragment

方式二:此方式是在fragment中通过getChildFragmentManager().getBackStackEntryCount()判断此fragment栈内已存的fragment的数量

getChildFragmentManager().beginTransaction()        .replace(R.id.XXX, fragment)        .addToBackStack(null)        .commit();