Fragment是activity的界面中的一部分或一种行为,下面这篇文章主要给大家介绍了关于Android中Fragment的基本用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

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

 

本文主要介绍了关于Android中Fragment的基本用法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一、fragment管理

在activity动态加载fragment

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

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

?

1

2

3

4

5

FragmentA fragment = new FragmentA();

 getSupportFragmentManager().beginTransaction()

  .add(R.id.XXX, fragment, "fragment")

//  .addToBackStack("") //加入回退栈

  .commit;

或者

?

1

2

3

4

FragmentManager manager = getSupportFragmentManager();

FragmentTransaction transaction = manager.beginTransaction();

transaction.add(R.id.fragment_container, fragment, "fragment");

transaction.commit();

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

?

1

2

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

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

?

1

2

3

4

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实例

?

1

2

3

4

Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");

getSupportFragmentManager().beginTransaction()

 .remove(fragment)

 .commit();

隐藏fragment

?

1

2

3

4

Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");

getSupportFragmentManager().beginTransaction()

 .hide(fragment)

 .commit();

显示fragment

?

1

2

3

4

Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");

getSupportFragmentManager().beginTransaction()

 .show(fragment)

 .commit();

拓展:

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

?

1

2

3

4

5

Fragment replaceFragment = getActivity().getSupportFragmentManager().findFragmentByTag("first_fragment");

    getActivity().getSupportFragmentManager().beginTransaction()

    .detach(replaceFragment)

    .attach(replaceFragment)

    .commit();

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

二、回滚操作

最常用:依次回滚

?

1

2

3

4

5

6

7

8

@Override

public void onBackPressed() {

if (getSupportFragmentManager().getBackStackEntryCount() <= 1) { //这里是取出我们返回栈存在Fragment的个数

 finish();

} else { //取出我们返回栈保存的Fragment,这里会从栈顶开始弹栈

 getSupportFragmentManager().popBackStack();

}

}

拓展:指定回滚

?

1

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时,表示连着参数一指定的这一层一起退出栈;

退回栈顶:

?

1

2

3

while (getSupportFragmentManager().getBackStackEntryCount()>1) {

 getSupportFragmentManager().popBackStackImmediate();

}

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

1.显示不出来:

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

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

?

1

2

3

4

5

6

7

8

9

@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的数量

?

1

2

3

4

getChildFragmentManager().beginTransaction()

 .replace(R.id.XXX, fragment)

 .addToBackStack(null)

 .commit();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。

 

 

转自:https://www.jb51.net/article/139612.htm

更多相关文章

  1. [置顶] Android图片异步加载之Android-Universal-Image-Loader
  2. Android(安卓)学习方式?
  3. android binder机制详解
  4. Socket 通信原理 -- Android客户端和服务器以TCP&&UDP方式互通
  5. App启动时三种效果(黑屏白屏、背景图片、延迟加载)
  6. Android(安卓)Studio加载慢/导入包慢/gradle慢的解决办法
  7. Android车轮之图片加载框架Android-Universal-Image-Loader
  8. Android开发笔记(十九)底部标签栏TabBar
  9. 在android平板上取位置和天气的实现方式

随机推荐

  1. [caffe(二)]Python加载训练caffe模型并进
  2. python中查看变量内存地址的方法
  3. python学习第二天笔记六,练习
  4. 全国高校绿色计算大赛 预赛第一阶段(Pytho
  5. python在文本开头插入一行
  6. Python爬虫(一):基本概念
  7. Python 学习笔记二
  8. python 报错——Python TypeError: 'modu
  9. python获取外网IP并发邮件
  10. 在Python中,如何在使用WPF的程序中自动控