我想告诉用户何时在导航抽屉中选择不同的片段。我试图使用
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
活动中,它显示了片段A.用户打开导航抽屉并选择片段B. setUserVisibleHint()
未在片段A中调用,因此我的代码可以知道它不再显示。我需要在片段A中隔离的代码以了解它何时未显示,因此它可以在某些变量上调用.stop()。这与活动中的onPause()用例相同。
答案 0 :(得分:3)
您只需致电
即可if (myFragment.isVisible()) {...}
或其他方式
public boolean isFragmentUIActive() {
return isAdded() && !isDetached() && !isRemoving();
}
答案 1 :(得分:2)
以下是我能想到的一些事情......
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
scan.nextLine();
double d = scan.nextDouble();
scan.nextLine();
String s = scan.nextLine();
System.out.println("String: " + s);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
触发,onPause
也会触发。这将告诉您何时旧片段不再可见(或很快就会隐藏)。如果它没有触发,那么你的代码中还有另一个问题,可能是片段类型的混合,还是XML中的硬编码片段?onDetach
,或准备手动设置。关于setUserVisibleHint
的使用,this回答有更多话要说。使用寻呼机时,可以同时连接多个片段,因此需要一个额外的方法(有些称之为生命周期事件)来判断片段是否“真正,真实”可见,因此引入了setUserVisibleHint
。 奖励:如果适合您的应用,请在setUserVisibleHint
之后致电addToBackStack
,使用后台筹码进行备份。我将此添加主要作为一个人们通常想要在他们的应用程序中添加的生命周期项。代码看起来像这样......
replace
我希望这会有所帮助。
答案 2 :(得分:0)
保留全局变量activeFragment
。
当用户点击片段时,请将activeFragment
设置为该片段。
...
val fragment: HomeFragment = HomeFragment()
activeFragment = HomeFragment
...
val fragment: SettingFragment = SettingFragment()
activeFragment = SettingFragment
然后,
if(FragmentA != activeFragment) {
//Call stop here
}