首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在活动重新创建后重置NavGraph

在活动重新创建后重置NavGraph
EN

Stack Overflow用户
提问于 2022-06-23 14:18:13
回答 3查看 195关注 0票数 0

我有一个包含两个片段的导航图,片段A和片段B。片段A是我的起始目的地。

如果我在片段B中,打开应用程序设置,并撤销许可,我会看到:

  1. 活动被重新创建,但我不认为onDestory被称为
  2. ,而不是用片段A启动活动,活动是从片段B开始的。

我还看到应用程序是重新创建的,直接打开活动B,而不是从活动A(旧代码,我们几乎没有活动)开始。

有没有办法以某种方式重置导航图,使其从片段A开始?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2022-06-24 07:55:13

最后,我这样做了:在onCreate中:

代码语言:javascript
复制
savedInstanceState?.let {
        if (!ConfigChange) {
            val fragment: Fragment? =
                supportFragmentManager.findFragmentById(R.id.my_nav_host)
            fragment.let {
                if (it is NavHostFragment) {
                    it.navController.navigate(R.id.fragmentA)
                }
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2022-06-23 23:46:35

当活动重新创建时,此代码将重置导航图。

代码语言:javascript
复制
override fun onStart() {
    super.onStart()
    navController.setGraph(R.navigation.your_nav_graph)
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-01 22:08:32

遇到你的问题,寻找一个类似的问题的答案。

在我的例子中,当权限状态改变时,我有一个活动应用程序在片段B中,并且在活动重新启动后在片段B中重新打开。和你一样,我希望我的活动从片段A开始,这也是我的导航图的开始或默认目标。

我解决问题的方法是,每当活动因为REASON_PERMISSION_CHANGE而退出时,我就会检测到,然后在活动的onCreate()中取消savedInstanceState

下面是一些代码:

代码语言:javascript
复制
// MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(
            when (requiresPermissionChangeRestart()) {
                true -> {
                    Log.e(TAG "Resetting Activity after permissions manual change")
                    null
                }
                false -> {
                    savedInstanceState
                }
            }
        )
    }
...
    private fun requiresPermissionChangeRestart(): Boolean = (getSystemService(Context.ACTIVITY_SERVICE)
            as ActivityManager).let { am ->
        am.getHistoricalProcessExitReasons(null, 0, 0)
            .find {
                it.reason == ApplicationExitInfo.REASON_PERMISSION_CHANGE
            }
            .run {
                when (this != null) {
                    true -> {
                        Log.w(TAG, "Permissions for package $packageName where changed by the user")
                        true
                    }
                    false -> false
                }
            }
    }

}

这可能是一种黑客,但这个小窍门可能会帮助你找到一个更适合你的问题的解决方案。只要在重要时从给定的活动中清除savedInstanceState,就应该能够按照预期的方式重新启动您的活动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72731760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档