Android中Fragment的基本用法示例总结

作者:loading 时间:2021-11-25 19:00:23 

前言

fragment 可认为是一个轻量级的Activity,但不同与Activity,它是要嵌到Activity中来使用的,它用来解决设备屏幕大小的不同,主要是充分利用界面上的空间,如平板上多余的空间。一个Activity可以插入多个Fragment,可以认为Fragment就是Activity上的一个View。

Android中Fragment的基本用法示例总结

本文主要介绍了关于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

标签:android,fragment,用法
0
投稿

猜你喜欢

  • 解决Android Studio 3.0 butterknife:7.0.1配置的问题

    2021-08-20 09:23:05
  • Java基于servlet监听器实现在线人数监控功能的方法

    2021-08-19 11:38:24
  • java实战之桌球小游戏

    2022-04-22 20:40:13
  • C#解决SQlite并发异常问题的方法(使用读写锁)

    2023-08-03 04:06:02
  • C#实现UI控件输出日志的方法详解

    2021-10-07 02:45:41
  • Spring Boot实现异步请求(Servlet 3.0)

    2023-11-27 06:26:47
  • Android中设置组件半透明和透明的效果示例

    2023-05-07 18:16:04
  • Java8新特性Stream流实例详解

    2023-05-04 12:55:05
  • 详解C#如何实现分割视频

    2022-12-07 10:48:23
  • 浅析C# 状态机Stateless

    2022-03-08 16:39:07
  • 详解commons-pool2池化技术

    2021-09-10 10:56:29
  • Android 自定义View 密码框实例代码

    2022-08-22 17:06:02
  • Android Button按钮的四种点击事件

    2021-12-16 04:02:41
  • 零基础写Java知乎爬虫之将抓取的内容存储到本地

    2022-08-16 20:25:45
  • C#获取任务栏显示进程的方法

    2023-08-28 11:09:53
  • 解析StreamReader与文件乱码问题的解决方法

    2022-09-11 18:34:56
  • 关于Android中自定义ClassLoader耗时问题的追查

    2021-08-10 06:15:23
  • Java中的vector类使用示例小结

    2023-09-01 02:46:59
  • C#实现IP摄像头的方法

    2023-12-09 03:42:51
  • java8从list集合中取出某一属性的值的集合案例

    2023-04-30 01:51:49
  • asp之家 软件编程 m.aspxhome.com