Fragment的setUserVisibleHint方法没有被回调的原因

当使用FragmentPagerAdapter并设置第二个参数为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT时,Fragment的setUserVisibleHint方法不会被回调。原因在于此设置只允许当前Fragment的onResume被回调。解决方法包括使用只有一个参数的构造或传入0,但这可能导致额外的onResume回调。onHiddenChanged方法虽然可作为替代,但仅在显隐状态变化时触发。

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

前提说明

1.本文是使用Activity+ViewPager+Fragment+FragmentPagerAdapter的形式来说明这个问题的,其他使用Fragment的方式暂时不涉及;
2.本文使用的Fragment系列是AndroidX包下的,不是support包下,本文后续的说明都是基于AndroidX系列去说明这个问题,请注意这点。

开始正文

使用Fragment的时候经常会判断Fragment的可见与不可见,以便能够做刷新UI,埋点等操作。常见的情况我们都会在Fragment的生命周期中做这种操作,但是通过本文使用Fragment的方式来说,Fragment的生命周期回调有两种情况:

1. 使用FragmentPagerAdapter含有两个参数的构造,并且第二个参数的值是BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT

这种情况下就会出现如题的setUserVisibleHint方法不会被回调的情况,至于为什么,看一下FragmentPagerAdapter的源码就知道了,下面贴出一小部分做简单说明:

// FragmentPagerAdapter中的代码:
public FragmentPagerAdapter(@NonNull FragmentManager fm,@Behavior int behavior) {
   
        mFragmentManager = fm;
        mBehavior = behavior;
}

上面是AndroidX下的FragmentPagerAdapter的两个参数的构造,第二个参数可以传的值就两个,其中就有BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT这个值,实际上从这个值的翻译就看出来了,它的意思是"只有当前可见(正在显示)的这个Fragment的onResume方法(被回

在 ArkUI(ArkTS)中,虽然没有直接对应于 Android FragmentsetUserVisibleHint 方法,但你可以通过监听 `page` 的可见性变化来模拟类似功能。你可以创建一个自定义组件,并在其中添加一个生命周期事件处理器,如下所示: ```typescript import { Page, Event } from 'harmonyos-extension-ui'; class CustomComponent extends React.Component { private pageRef: Page | null = null; componentDidMount() { if (this.pageRef) { // 监听页面可见性变化 this.pageRef.addEventListener(Event.Page.VISIBLE, this.onPageVisible); this.pageRef.addEventListener(Event.Page.HIDDEN, this.onPageHidden); } } componentWillUnmount() { if (this.pageRef) { this.pageRef.removeEventListener(Event.Page.VISIBLE, this.onPageVisible); this.pageRef.removeEventListener(Event.Page.HIDDEN, this.onPageHidden); } } onPageVisible = () => { console.log('页面变得可见'); // 在这里可以执行你想在FragmentsetUserVisibleHint(true) 时执行的操作 this.props.setUserVisibleHint && this.props.setUserVisibleHint(true); }; onPageHidden = () => { console.log('页面变得不可见'); // 类似地,在这里执行你想在FragmentsetUserVisibleHint(false) 时执行的操作 this.props.setUserVisibleHint && this.props.setUserVisibleHint(false); }; render() { // 返回你的组件视图 return <div>...</div>; } } // 在你的应用中使用 CustomComponent <CustomComponent setUserVisibleHint={callback} /> ``` 在这个例子中,我们假设你有一个名为 `setUserVisibleHint` 的 prop,它接收一个回调函数。当页面变得可见或隐藏时,我们会调用这个回调函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值