Android中Fragment的基本用法示例总结
作者:loading 发布时间:2021-11-25 19:00:23
前言
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 = 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();
来源:http://www.androidchina.net/8365.html


猜你喜欢
- 前言在使用Mybatis-Plus新增的时候,我们往往想要id随着数据库自增,但是如果不是我们指定id为auto(自增)的话,会通过算法算出
- 举个例子:我有如下的一个需求,当我想要取得用户信息的时候,会先从本地缓存中查找,找不到然后从分布式缓存中查找,最后找不到再从数据库中查询。但
- 通俗的来说,Jackson是一个 Java 用来处理 JSON 格式数据的类库,其性能非常好。本文就来针对Jackson的用法做一个较为详细
- DataGridView:显示数据表后台数据绑定:List<xxx> list = new List<xxx>();
- 最近有个粉丝提了个问题,说他在Spring Security中用JWT做退出登录的时无法获取当前用户,导致无法证明“我就是要退出的那个我”,
- 本文实例讲述了C#编程之事务用法。分享给大家供大家参考,具体如下:ado.net2.0的SqlTransaction使用方法/////ado
- AndroidMaifest.xml中声明权限<!-- 声明所有需要的权限(包括普通权限和危险权限) --><uses-p
- 问题 webView调用JS出错。 class TestJS {&n
- AndroidStudio 实现加载字体资源的方法在android中字体的格式总是不能尽善尽美的显示出来 , 于是要求我们使用一
- 使用idea进行JavaWeb开发时,在前端与后台交互常常出现乱码问题,包括日志/控制台输出乱码,参数乱码等问题,归根结底是编码格式不对,解
- 前言经过前面对 Kotlin 的介绍,相信大家已经能对 Kotlin 有了一个基本的认识。 从这节开始,我就为大家讲解 Kotlin的方法以
- 本文实例讲述了Android编程实现使用webView打开本地html文件的方法。分享给大家供大家参考,具体如下:在布局的配置文件里:<
- 封面图下个季度的目标是把前端监控相关的内容梳理出来,梳理出来之后可能会在公司内部做个分享~Flutter应用程序既括代码也包括一些其他的资产
- 什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。
- 该配置基于IDEA2020.1版本,如后续有版本更新或者配置变更,再更新idea64.exe.vmoptions配置为提供IDEA启动速度和
- 很多人都知道:浮点数值不适用于无法接受舍入误差的金融计算中,即:我们常说的丢失精度问题。这是为什么呢?很多人还知道这样一句话:这种舍入误差的
- C#中如何给Excel添加水印我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的
- 1.使用IDEA新建项目2.选择创建Maven工程3.填写GroupId和ArtifactId4.填写项目名称,与上一步的ArtifactI
- 用户列表页面开发项目介绍用户列表页面开发,可以实现简单的查询,删除,修改,和添加用户信息功能。前端使用vue框架,后端使用springboo
- 实现代码超简单,具体实现方法如下:有时候当我们的游戏人物遇敌时,我们需我怪物随机根据概率选择处理方式,如下:1、50%的机会友好的问候2、2