是否可以使用 Android Jetpack 导航组件来导航设置首选项的片段?我有一个带有多个嵌套首选项片段的设置屏幕。我想知道使用 Android Jetpack 导航组件来简化我的任务是否可行?
android android-preferences kotlin android-jetpack-navigation
我目前正在将应用程序迁移到androidX和新的导航组件。我的应用程序具有彼此嵌套的不同设置屏幕。在androidX之前,PreferenceScreen它们彼此嵌套。现在,这被处理为:
<Preference
app:fragment="com.example.SyncFragment"
.../>
Run Code Online (Sandbox Code Playgroud)
因此,在XML中,我们PreferenceFragmentCompat通过单击该首选项为要显示的类提供一个绝对的类名。片段事务必须由保存片段的Activity来实现。我很乐意这样做,NavControler但这是我的问题:
override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
val nav = Navigation.findNavController(this, R.id.nav_host_fragment)
nav.navigate(<Fragment ID>) // Only int IDs can be passed here
return true
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以给pref我通过此回调获得的引用ID,以便我可以使用来处理片段事务NavControler?还是我在这里使事情复杂化而错过了什么?
我们有一个PreferenceFragmentCompat,然后点击一个首选项,我们想从当前的 切换PreferenceFragmentCompat到新的PreferenceFragmentCompat。(在新屏幕上进行某些设置)。
但是,无论我们尝试过什么,我们都会遇到以下错误:
Fragment 声明的目标片段不属于此 FragmentManager
主活动.kt
class MainActivity : AppCompatActivity(), ActivityCompat.OnRequestPermissionsResultCallback, PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_preferences
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
val …Run Code Online (Sandbox Code Playgroud)