android Fragment切换

本文探讨了Fragment在Android应用中的管理技巧,包括如何通过HeadlessFragment分离数据与UI以减少内存消耗,以及解决Fragment重叠问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于Fragment搜集到的

问题一:保存UI与数据的内存消耗

上面所述为避免重新实例化而带来的“重新加载一边数据”、“消耗数据流量”,其实是这个Fragment不够“纯粹”。

Fragment应该分为UI FragmentHeadless Fragment

前者是指一般的定义了UI的Fragment,后者则是无UI的Fragment,即在onCreateView()中返回的是null将与UI处理无关的异步任务都可以放到后者中,而且一般地都会在onCreate()中加上setRetainInstance(true)故而可以在横竖屏切换时不被重新创建和重复执行异步任务。

这样做了之后,便可以不用管UI Fragment的重新创建与否了,因为数据和异步任务都在无UI的Fragment中,再通过Activity 的 FragmentManager 交互即可。

只需记得在Headless Fragment销毁时将持有的数据清空、停止异步任务。

UIFragment.java
1
2
3
4
5
6
7
8
9
10
11
public class UIFragment extends Fragment{

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment,
        container, false);
    return view;
  }
  ...
}
HeadlessFragment.java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class HeadlessFragment extends Fragment{

  @Override
  public void onCreate(Bundle savedInstanceState) {
    setRetainInstance(true);
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    return null;
  }
  ...
}

具体实例代码如下:

  1. ApiDemo: FragmentRetainInstance.java

  2. MostafaGazar Sample: PhotosListTaskFragment.java

问题二:Fragment重叠

其实是由Activity被回收后重启所导致的Fragment重复创建和重叠的问题。

在Activity onCreate()中添加Fragment的时候一定不要忘了检查一下savedInstanceState

1
2
3
4
if (savedInstanceState == null) {
    getFragmentManager().beginTransaction().add(android.R.id.content,
                new UIFragment()).commit();
}

多个Fragment重叠则可以这样处理:通过FragmentManager找到所有的UI Fragment,按需要show()某一个Fragment,hide()其他即可!

为了能准确找出所需的Fragment,所以在add()或者replace() Fragment的时候记得要带上tag参数,因为一个ViewGroup 容器可以依附add()多个Fragment,它们的id自然是相同的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (savedInstanceState == null) {
    // getFragmentManager().beginTransaction()...commit()
}else{
  //先通过id或者tag找到“复活”的所有UI-Fragment
  UIFragment fragment1 = getFragmentManager().findFragmentById(R.id.fragment1);
  UIFragment fragment2 = getFragmentManager().findFragmentByTag("tag");
  UIFragment fragment3 = ...
  ...
  //show()一个即可
  getFragmentManager().beginTransaction()
          .show(fragment1)
          .hide(fragment2)
          .hide(fragment3)
          .hide(...)
          .commit();
}

注: 关于Fragment id的问题建议阅读 FragmentManager中moveToState()源码


运行界面和数据分开处理

这样重新加载的时候可以不用重新请求
上面的Fragment应该分为UI FragmentHeadless Fragment适合于切换横竖屏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值