我有一个包含2个片段的导航图,片段A和片段B。片段A是我的起始目的地。如果我在片段B中,打开应用设置,并撤销权限,我会看到:
onDestory
lawou6xi1#
我最后是这样做的:在onCreate中:
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) } } } }
zu0ti5jz2#
此代码将在重新创建活动时重置导航图。
override fun onStart() { super.onStart() navController.setGraph(R.navigation.your_nav_graph) }
arknldoa3#
遇到您的问题,正在寻找类似问题的答案。在我的例子中,我有一个Activity应用,当权限状态改变时,它位于片段B中,并且在Activity重新启动后,它也会在片段B中重新打开。和您一样,我希望Activity从片段A开始,这也是导航图的起始位置或默认目标位置。我解决这个问题的方法是,每当Activity由于REASON_PERMISSION_CHANGE而 exited 时,我都会进行检测,然后将Activity的onCreate()中的savedInstanceState设为无效。下面是一些代码:
REASON_PERMISSION_CHANGE
onCreate()
savedInstanceState
// 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 } } } }
这可能是一种技巧,但这个小技巧可能会帮助您找到更适合您的特定问题的解决方案。只要您在重要的时候从给定Activity中删除savedInstanceState,您就应该能够以您期望的方式 * 重新启动 * Activity。
3条答案
按热度按时间lawou6xi1#
我最后是这样做的:在onCreate中:
zu0ti5jz2#
此代码将在重新创建活动时重置导航图。
arknldoa3#
遇到您的问题,正在寻找类似问题的答案。
在我的例子中,我有一个Activity应用,当权限状态改变时,它位于片段B中,并且在Activity重新启动后,它也会在片段B中重新打开。和您一样,我希望Activity从片段A开始,这也是导航图的起始位置或默认目标位置。
我解决这个问题的方法是,每当Activity由于
REASON_PERMISSION_CHANGE
而 exited 时,我都会进行检测,然后将Activity的onCreate()
中的savedInstanceState
设为无效。下面是一些代码:
这可能是一种技巧,但这个小技巧可能会帮助您找到更适合您的特定问题的解决方案。只要您在重要的时候从给定Activity中删除
savedInstanceState
,您就应该能够以您期望的方式 * 重新启动 * Activity。