我有一个包含两个片段的导航图,片段A和片段B。片段A是我的起始目的地。
如果我在片段B中,打开应用程序设置,并撤销许可,我会看到:
onDestory被称为我还看到应用程序是重新创建的,直接打开活动B,而不是从活动A(旧代码,我们几乎没有活动)开始。
有没有办法以某种方式重置导航图,使其从片段A开始?
谢谢。
发布于 2022-06-24 07:55:13
最后,我这样做了:在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)
}
}
}
}发布于 2022-06-23 23:46:35
当活动重新创建时,此代码将重置导航图。
override fun onStart() {
super.onStart()
navController.setGraph(R.navigation.your_nav_graph)
}发布于 2022-11-01 22:08:32
遇到你的问题,寻找一个类似的问题的答案。
在我的例子中,当权限状态改变时,我有一个活动应用程序在片段B中,并且在活动重新启动后在片段B中重新打开。和你一样,我希望我的活动从片段A开始,这也是我的导航图的开始或默认目标。
我解决问题的方法是,每当活动因为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
}
}
}
}这可能是一种黑客,但这个小窍门可能会帮助你找到一个更适合你的问题的解决方案。只要在重要时从给定的活动中清除savedInstanceState,就应该能够按照预期的方式重新启动您的活动。
https://stackoverflow.com/questions/72731760
复制相似问题