关于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();
add
和replace
的区别是:
①add
是往container
容器里堆加fragment
View
;replace
是将container
容器里之前添加的View
全部清除,然后再添加当前fragment
View
一定要记住,replace
清除的是container
的视图,而不是fragment
实例, remove
移除的才是fragment
实例
②add
后期可以使用show
,hide
操作,但是replace
不可以,原因见①
③使用add
,回滚时,fragment
不会重新加载,曾经的操作痕迹还存在,使用replace
回滚时,之前的fragment
会重新加载,原因见①
使用add
的时候还有一点需要注意的是,视图重叠的问题,记得设置背景色 add
和 replace
千万不要混合使用,否则会出错
在进行remove
,hide
,show
之前要记得判断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
是重建视图View
,attach
后的视图会位于视图最前面,具体的可以自己去查看资料
二、回滚操作
最常用:依次回滚
@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();
- 关于Fragment的基本用法总结
- fragment的基本用法
- 关于Fragment的用法
- Fragment的基本用法介绍
- Android----Fragment的基本用法
- 关于Fragment的三个用法
- 关于jquery的$.ajax的基本用法总结
- Andriod Fragment 的作用和基本用法
- 关于TabLayout+ViewPager+Fragment 简单明了的用法
- 关于监听的基本用法
- CListctrl的基本用法总结
- ViewPager + Fragment 用法总结
- Fragment用法总结
- 关于fragment的学习总结(1)
- 关于Fragment总结
- 仿QQ聊天界面基本的Fragment用法。
- ViewPager、ViewPager和Fragment组合使用的基本用法
- 关于typedef的用法总结
- 完全零基础安装MySQL
- 前端框架+生态
- FreeMarker学习之旅
- Typical memory usage for objects in java
- Codeforces 821C Okabe and Boxes 思维模拟
- 关于Fragment的基本用法总结
- C++构造、析构的一些理解
- 基础JAVA IO
- Java基础部分重要笔记
- ubuntu下Pycharm安装及配置
- HttpServlet详解
- input中的value和placeholder区别
- 51Nod-1766-树上的最远点对
- Distinct Substrings SPOJ