【发布时间】:2022-01-04 15:16:51
【问题描述】:
希望所有人都安全。在使用 ActionBar 中的 ActionBar 和 Up 按钮时,我遇到了一个令人沮丧的问题。我的应用中有以下片段结构:
MainFragment -
|- SettingsFragment -
|- GeneralSettingsFragment
|- ScaryStuffSettingsFragment
以上所有片段都启用了 ActionBar。 SettingsFragment、GeneralSettingsFragment 和 ScaryStuffFragment 都启用了向上按钮,以便用户可以在需要时按上述顺序返回。
在我的 MainFragment 中,我有以下代码可以访问 SettingsFragment:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
super.onOptionsItemSelected(item)
when(item.itemId) {
R.id.action_main_to_settings_menu -> {
onOptionSettingsClick()
}
}
return true
}
/** When the user taps the options menu settings button, we'll take them to the
* settings menu.
*/
private fun onOptionSettingsClick() {
findNavController().navigate(R.id.settingsFragment)
}
在我的 SettingsFragment 中,我有以下内容:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId) {
android.R.id.home -> findNavController().navigateUp()
}
return super.onOptionsItemSelected(item)
}
SettingsFragment 中使用的代码与 ScaryStuffSettingsFragment 和 GeneralSettingsFragment 中使用的代码相同。
现在,当我点击 MainFragment 中的设置时,它会将我带到 SettingsFragment。那里没有问题。如果我点击 SettingsFragment ActionBar 中的向上按钮,同样,它会将我发送到 MainFragment。
如果我点击“可怕的东西”或“常规设置”,我将毫无问题地转到相关片段。如果我点击任一片段中的向上按钮,它会将我带到 SettingsFragment。再次。这里没有问题。
但是,如果我想在使用向上按钮点击“可怕的东西”或“常规”后从 SettingsFragment 返回 MainFragment...什么都不会发生。
我发现,如果我点击设备本身的后退按钮,它会带我回到 MainFragment 完全规避问题,但我不希望用户在大多数设置中使用向上按钮然后必须点击返回按钮(如果有意义的话)。
一旦选择了其中一个子片段,它会“忘记” MainFragment 和 SettingsFragment 之间的传输,这是怎么回事?
谢谢!
编辑:
MainFragment 是一个普通的片段。它的onCreateView如下:
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstance: Bundle?): View {
_binding = FragmentMainBinding.inflate(inflater, container, false)
setHasOptionsMenu(true)
return binding.root
}
我的所有三个设置应用程序都是 PreferenceFragments,因此具有以下内容:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.general_settings_preferences, rootKey)
setHasOptionsMenu(true)
}
编辑 2:
我现在有以下内容:
主活动:
override fun onCreate(savedInstanceState: Bundle?) {
navController = findNavController(R.id.nav_host)
appBarConfiguration = AppBarConfiguration.Builder(R.id.FragmentMain).build()
val hostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_container) as NavHostFragment?
//navController = hostFragment?.navController!! // Commented out due to throwing a nullpointerexception
setupActionBarWithNavController(navController, appBarConfiguration)
}
override fun onSupportNavigateUp(): Boolean {
return (NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp())
}
当我这样做(并更新我的导航图),然后点击设置(转到我的 SettingsFragment)时,它会短暂显示 SettingsFragment,然后更改为顶部的设置(这是因为我用 @987654327 告诉它@ 在我的onCreateOptionsMenu 方法中。然后,当我点击返回时,这会按预期工作。但是,当我然后点击可怕的东西(转到 ScaryStuffSettingsFragment)或常规设置(转到 GeneralSettingsFragment)时,它会做同样的事情并且在顶部闪烁 Fragment 的名称,然后更改为我设置的名称,当我点击向上箭头时,它会将我送回 Main Fragment。
我只希望设置菜单返回到 MainFragment,其他设置应该转到设置菜单(如果有意义的话)。
【问题讨论】:
-
有谁知道我如何做到这一点?
-
你能发布导航到可怕的东西或一般的代码
标签: android kotlin android-fragments android-architecture-components android-navigation