首页 > 解决方案 > 从 PreferenceScreen 导航到另一个 Fragment

问题描述

使用 Android Jetpack 的导航组件,我有一个 MainActivity,它包含 4 个不同的片段。其中一个片段是 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,这将为导航器创建操作。但是我怎样才能捕捉到画廊点击事件呢?有没有具体的方法可以做到这一点?

标签: androidkotlinnavigationandroid-preferencesandroid-architecture-navigation

解决方案


在您的设置片段中。添加首选项更改侦听器。然后在侦听器中添加您的导航代码类似这样的东西。

        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
            }
        }

推荐阅读