android - 如何在 Android 的 Fragment 中使用 setUserVisibleHint

标签 android android-fragments kotlin fragment

在我的应用程序中,我有 BottomNavBar,我想在单击此 BottomNavBar 的项目时显示 fragments!
为了使用 BottomNavBar 设置此 fragments,我使用了 NavigationGraph成分!

我想对这个 fragment 之一使用 setUserVisibleHint 方法,但是当显示这个 fragment 时不调用 < strong>setUserVisibleHint !

我的 Activity 代码,用于将 fragments 设置为 BottomNavBar 项目:

class HomeActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setupNavigation()

    }

        private fun setupNavigation() {
        val navController = Navigation.findNavController(this, R.id.homePage_fragmentNavHost)
        NavigationUI.setupWithNavController(homePage_bottomNavBar, navController)
    }

    override fun onSupportNavigateUp() = Navigation.findNavController(this, R.id.homePage_fragmentNavHost).navigateUp()
}

我的 fragment 代码:

class HomeDashboardFragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home_dashboard, container, false)
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            Handler().postDelayed({ requireContext().toast("Show") }, 500)
        }
    }
}

为什么不将 setUserVisibleHint 工作到 fragment 中?

最佳答案

由于 setUserVisibleHint(boolean aBoolean) 现在已弃用,对于那些仍然想知道 fragment 何时可​​见的人,您仍然可以使用

 public FragmentTransaction setMaxLifecycle(Fragment fragment, Lifecycle.State state)

间接使用 FragmentPagerAdapter(或 FragmentStatePagerAdapter) 只需使用新的构造函数

MyFPagerAdapter(FragmentManager fm) {
        super(fm ,FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
       //...
}

请注意 FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 允许适配器在内部使用 setMaxLifecycle(通过 setPrimaryItem)而不是 setUserVisibleHint。 因此,在 fragment 的实现中,您将不再需要使用

setUserVisibleHint(boolean aBoolean)

但相反,onResume() 因为现在 onResume() 将仅针对可见 fragment 调用。其余的仍然可以到达 onCreateView()。

直接的方法是在添加或切换 fragment 时使用 setMaxLifeCycle 和 FragmentTransaction,然后

setMaxLifecycle(fragment, Lifecycle.State.STARTED);

等价

setUserVisibleHint(false);

setMaxLifecycle(fragment, Lifecycle.State.RESUMED);

相当于

setUserVisibleHint(true);

然后再次监听 Fragment 的 onResume() 回调

关于android - 如何在 Android 的 Fragment 中使用 setUserVisibleHint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130557/

相关文章:

android - 如何在imageview中获取图像边缘x/y位置

android - 从返回堆栈返回后 fragment 不刷新内容

java - 安卓.view.InflateException : Binary XML file line #8: Error inflating class fragment

android - 在 onCreateView 与 onActivityCreated 的 fragment 中检索 Activity 范围的 ViewModel

android - Kotlin JaCoCo,无覆盖 -> IllegalClassFormatException ...请提供原始的非仪器类

Android Studio : Documentation not showing. 找不到方法调用 `method` 的候选项

android - NoClassDefFoundError : com. google.firebase.FirebaseOptions(firebase 和 admob)

android - 与安卓 RIL 通信

Java 记录与 Kotlin 数据类

arraylist - 在kotlin中将一个数组列表复制到另一个数组列表