时间:2021-05-20
前言
fragment 可认为是一个轻量级的Activity,但不同与Activity,它是要嵌到Activity中来使用的,它用来解决设备屏幕大小的不同,主要是充分利用界面上的空间,如平板上多余的空间。一个Activity可以插入多个Fragment,可以认为Fragment就是Activity上的一个View。
本文主要介绍了关于Android中Fragment的基本用法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
一、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
拓展:
在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();总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment。第二个则是动态的fragment。静态fragment直接在lay
单Activity多Fragment实现底部导航器最近由于Android基础知识讲解需要,采用单Activity多Fragment实现类似QQ底部导航器示例,这
一,Android装载器基本方法装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性:它们
在Android中,对Fragment的操作都是通过FragmentTransaction来执行。而从Fragment的结果来看,FragmentTransac
FragmentAndroid是在Android3.0(APIlevel11)开始引入Fragment的。可以把Fragment想成Activity中的模块,这