如何判断片段在NavigationDrawer中何时不可见

时间:2017-07-23 19:34:54

标签: android android-layout android-fragments kotlin android-view

我想告诉用户何时在导航抽屉中选择不同的片段。我试图使用

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()用例相同。

3 个答案:

答案 0 :(得分:3)

您只需致电

即可
if (myFragment.isVisible()) {...}

或其他方式

public boolean isFragmentUIActive() {
    return isAdded() && !isDetached() && !isRemoving();
}

答案 1 :(得分:2)

以下是我能想到的一些事情......

  1. 使用一致的片段,支持或原生,而不是两者。并且,有人说支持片段更可取(更好地维护)。
  2. 确保片段容器未以XML格式编码。如果您打算替换片段,那么初始片段应该由您的代码动态加载(通常使用id作为您的R.id. {frameLayoutId}加载到FrameLayout中。)
  3. 使用 Frament生命周期事件。替换片段时会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中的硬编码片段?
  4. 仅在片段寻呼机中使用onDetach,或准备手动设置。关于setUserVisibleHint的使用,this回答有更多话要说。使用寻呼机时,可以同时连接多个片段,因此需要一个额外的方法(有些称之为生命周期事件)来判断片段是否“真正,真实”可见,因此引入了setUserVisibleHint
  5. 奖励:如果适合您的应用,请在setUserVisibleHint之后致电addToBackStack,使用后台筹码进行备份。我将此添加主要作为一个人们通常想要在他们的应用程序中添加的生命周期项。代码看起来像这样......

    replace
  6. 我希望这会有所帮助。

答案 2 :(得分:0)

保留全局变量activeFragment。 当用户点击片段时,请将activeFragment设置为该片段。

...
val fragment: HomeFragment = HomeFragment()
activeFragment = HomeFragment

...
val fragment: SettingFragment = SettingFragment()
activeFragment = SettingFragment

然后,

if(FragmentA != activeFragment) {
    //Call stop here
}