有关Fragment的妙用

有关Fragment的妙用

Fragment 是Google于Android3.0推出的, 是用于解决Android设备碎片化的方案, 说起Fragment, 大部分人第一时间想到的应该是和UI相关, 但今天我要说的, 是Fragment除去绘制界面之外的用途。

Fragment的用途:

  • 绘制界面
  • 检测Activity生命周期
  • 存储变量(相当于Activity的扩展变量)

上面我给出了三个用途, 绘制界面就不谈了, 我们做Android开发的天天都会用到, 今天主要谈谈其他两个。

检测Activity生命周期

最简单的一个例子,就是我们所熟知Glide,其源码中就用到了Fragment来检测Activity的声明周期, 如下是关键代码:

在这里插入图片描述

那么这么做有什么好处呢?

  1. 可以达到监听Activity生命周期的目的
  2. 无需重写Activity生命周期方法
  3. 在任意地方都可以使用, 只需要一个 Activity 对象
  4. 请求权限时无需重写 onRequestPermissionsResult() 方法
  5. startActivityForResult()时无需在Activity中重写onActivityResult()方法

那么如何利用Fragment做到上述5点呢? 不要着急, 且听我徐徐道来


1. 监听Activity生命周期(实现1 2 3三点)

准确来讲, 是监听Activity除onCreate()之外的其他常用生命周期。我们知道, 当我们创建一个Fragment, 有时会重写下面几个方法:

  • onActivityCreated(Bundle savedInstanceState)
  • onResume()
  • onPause()
  • onStart()
  • onStop()
  • onDestroy()
  • onSaveInstanceState(Bundle outState)

我们首先要明确一点, 这些方法并非是Fragment的声明周期方法, 而是Activity的声明周期方法, 大家可以自行写Demo测试或者查看源码。今天所说的Fragment的用途全部都是建立在此基础之上的。

回到正题,要想利用Fragment检测Activity声明周期, 其实只需要创建一个Fragment添加至Activity中, 就可以监听Activity的声明周期。至此我们已经达到目的了。

public DemoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
   
	super(context, attrs, defStyleAttr);
	Activity activity = ActivityHelper.getActivity(getContext());
	activity.getFragmentManager().beginTransaction().add(new Fragment(){
   
		@Override
		public void onDestroy() {
   
			super.onDestroy();
		}
	}, "TEST").commitAllowingStateLoss();
}

那么每次需要监听Activity声明周期都要创建一个Fragment吗?显然是否定的, 我们只需要创建一个特殊的Fragment, 在其中定义一个集合供外加添加或移除监听, 仅需要一个Fragment就可以达到目的。

public class ActivityLifecycleFragment extends android.support.v4.app.Fragment{
   
	private static final int CAPACITY = 5;
	private List<ActivityLifecycle> mCallbacks = new ArrayList<>(CAPACITY);

	public ActivityLifecycleFragment addCallback(ActivityLifecycle callbacks) {
   
		mCallbacks.add(callbacks);
		return this;
	}

	public ActivityLifecycleFragment removeCallback(ActivityLifecycle callbacks){
   
		mCallbacks.remove(callbacks);
		return this;
	}

	//...然后在 onResume() onPause() 等方法中调用 mCallbacks 一一触发监听
	@Override
	public void 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值