我试图告诉用户何时在我的导航抽屉中选择其他片段。我正在尝试使用
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()相同。 最佳答案
这是我能想到的几件事...
onPause
,onDetach
也会触发。这将告诉您何时您的旧片段不再可见(或不久将不可见)。如果没有触发,那么您的代码中还有另一个问题,可能是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" />
我希望这有帮助。