我试图告诉用户何时在我的导航抽屉中选择其他片段。我正在尝试使用

override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)
}

我如何在MainActivity中切换片段:
override fun onNavigationItemSelected(item: MenuItem): Boolean {
        // Handle navigation view item clicks here.
        when (item.itemId) {

            R.id.nav_camera -> {
                // Handle the camera action
                val fragment: HomeFragment = HomeFragment()
                supportFragmentManager.beginTransaction().replace(R.id.content_main, fragment).commit()

            }
            R.id.nav_manage -> {
                val fragment: SettingFragment = SettingFragment()
                fragmentManager.beginTransaction().replace(R.id.content_main, fragment).commit()

            }
            R.id.nav_share -> {
                onInviteClicked()

            }
            R.id.nav_send -> {

                val emailIntent: Intent = Intent(android.content.Intent.ACTION_SEND)
                emailIntent.type = Constants.FEEDBACK_EMAIL_TYPE

                emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
                        arrayOf(Constants.FEEDBACK_EMAIL_ADDRESS))

                emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
                        Constants.FEEDBACK_EMAIL_SUBJECT)

                startActivity(Intent.createChooser(
                        emailIntent, Constants.FEEDBACK_TITLE))


            }
        }

        val drawer: DrawerLayout = findViewById(R.id.drawer_layout)
        drawer.closeDrawer(GravityCompat.START)
        return true
    }

但是,这似乎根本没有被调用。例如,在我的NavigationDrawer Activity 中,它显示片段A。用户打开导航抽屉,然后选择片段B。片段A中没有调用setUserVisibleHint(),因此我的代码可以知道不再显示它。我需要隔离在片段A中的代码来了解何时未显示它,以便可以在某些变量上调用.stop()。这与 Activity 中的onPause()相同。

最佳答案

这是我能想到的几件事...

  • 使用一致的片段,即“支持”或“本机”,不能同时使用两者。而且,有人说支持片段是可取的(更好地维护)。
  • 确保片段容器未使用XML进行硬编码。如果要替换片段,则代码应动态加载初始片段(通常,您将使用id作为R.id. {frameLayoutId}将其加载到FrameLayout中)。
  • 请使用 Frament生命周期事件。替换片段时会触发onPauseonDetach也会触发。这将告诉您何时您的旧片段不再可见(或不久将不可见)。如果没有触发,那么您的代码中还有另一个问题,可能是Fragment类型的混合或XML中的硬编码片段?
  • 仅在片段寻呼机中使用setUserVisibleHint,或准备手动进行设置。 this答案还有更多关于setUserVisibleHint的使用的说法。使用寻呼机时,可以一次附加多个片段,因此需要一种额外的方法(有人称它为生命周期事件)来判断一个片段是否“真正,真正”可见,因此引入了setUserVisibleHint
  • 奖励:如果适合您的应用程序,请在addToBackStack之后调用replace来使用后退堆栈进行备份。我主要将其添加为他们通常希望在其应用中添加的生命周期项目。代码看起来像这样...
    // to initialize your fragment container
    supportFragmentManager
            .beginTransaction()
            .add(R.id.content_fragment, fragment)
            .addToBackStack("blank")
            .commit()
    
    // to update your fragment container
    supportFragmentManager
            .beginTransaction()
            .replace(R.id.content_fragment, fragment)
            .addToBackStack("settings")
            .commit()
    
    //in your XML, it can be as simple as adding the FrameLayout below,
    // if you start with the Android Studio template for Navigation drawer,
    // you can replace the call that includes the "content_main" layout
    
    <!--<include layout="@layout/content_main" /> -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/content_fragment" />
    

  • 我希望这有帮助。

    10-07 22:18