从 PreferenceScreen 导航到另一个 Fragment
Navigate from PreferenceScreen to another Fragment
使用 Android Jetpack 的导航组件,我有一个包含 4 个不同片段的 MainActivity。其中一个片段是 SettingsFragment,它具有我在 xml 文件中的偏好设置。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="General settings">
<PreferenceScreen
android:summary="Choose an account from your list"
android:title="Accounts">
<intent android:action="@string/preferences_account_intent_action" />
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="User settings">
<SwitchPreference
android:defaultValue="true"
android:enabled="true"
android:key="user_show_notif_content"
android:summaryOn="Show message content on new notification"
android:summaryOff="Hide message content on new notification"
android:title="Message content" />
<PreferenceScreen
android:key="gallery"
android:summary="List of all the files of the application"
android:title="Gallery">
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
并且 SettingsFragment 扩展了 Android 的 PreferenceFragmentCompat。从所有其他片段中,我可以通过 MainActivity 中的 findNavigation 实用程序相互导航。
当我从设置中按下“图库”选项时,我想从 SettingsFragment 导航到 GalleryFragment。
我已将 GalleryFragment 添加到 MainActivity 导航图,并将 SettingsFragment 连接到 GalleryFragment,后者为导航器创建操作。但是我怎样才能捕捉到图库点击事件呢?
有具体的方法吗?
在您的设置片段中。添加首选项更改侦听器。然后在侦听器中添加您的导航代码
像这样。
val preferenceGallery = preferenceManager.findPreference<Preference>("preferenceIDGallery")!!
preferenceGallery.let {
it.setOnPreferenceChangeListener { preference, newValue ->
val f = requireActivity().supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController: NavController = f.navController //for fragment switch
navController.navigate(R.id.fragmentGallery)
true
}
}
使用@Viatcheslav Ehrmann 的回答,解决方案如下
<PreferenceScreen
android:key="pref_gallery"
android:summary="File list of application"
android:title="Gallery" />
在我做的 SettingsFragment 的 onCreate 中
preferenceManager.findPreference<Preference>("pref_gallery")?.let {
it.setOnPreferenceClickListener {
findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToGalleryFragment())
true
}
}
使用 Android Jetpack 的导航组件,我有一个包含 4 个不同片段的 MainActivity。其中一个片段是 SettingsFragment,它具有我在 xml 文件中的偏好设置。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="General settings">
<PreferenceScreen
android:summary="Choose an account from your list"
android:title="Accounts">
<intent android:action="@string/preferences_account_intent_action" />
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="User settings">
<SwitchPreference
android:defaultValue="true"
android:enabled="true"
android:key="user_show_notif_content"
android:summaryOn="Show message content on new notification"
android:summaryOff="Hide message content on new notification"
android:title="Message content" />
<PreferenceScreen
android:key="gallery"
android:summary="List of all the files of the application"
android:title="Gallery">
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
并且 SettingsFragment 扩展了 Android 的 PreferenceFragmentCompat。从所有其他片段中,我可以通过 MainActivity 中的 findNavigation 实用程序相互导航。 当我从设置中按下“图库”选项时,我想从 SettingsFragment 导航到 GalleryFragment。 我已将 GalleryFragment 添加到 MainActivity 导航图,并将 SettingsFragment 连接到 GalleryFragment,后者为导航器创建操作。但是我怎样才能捕捉到图库点击事件呢? 有具体的方法吗?
在您的设置片段中。添加首选项更改侦听器。然后在侦听器中添加您的导航代码 像这样。
val preferenceGallery = preferenceManager.findPreference<Preference>("preferenceIDGallery")!!
preferenceGallery.let {
it.setOnPreferenceChangeListener { preference, newValue ->
val f = requireActivity().supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController: NavController = f.navController //for fragment switch
navController.navigate(R.id.fragmentGallery)
true
}
}
使用@Viatcheslav Ehrmann 的回答,解决方案如下
<PreferenceScreen
android:key="pref_gallery"
android:summary="File list of application"
android:title="Gallery" />
在我做的 SettingsFragment 的 onCreate 中
preferenceManager.findPreference<Preference>("pref_gallery")?.let {
it.setOnPreferenceClickListener {
findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToGalleryFragment())
true
}
}