AndroidX 首选项和导航

AndroidX Preferences and Navigation

是否有将 Jetpack/androidx 首选项库与导航组件/Single 一起使用的示例 activity?我看到的所有示例(例如 Google's example)都使用 supportFragmentManager 并替换 FrameLayout 的内容。

使用导航组件导航到 PreferenceFragmentCompat() 几乎可以正常工作,因为它显示了首选项页面,但缺少所有 toolbar/navigation 图标。它只是植入到前一个片段之上,因此要退出它,您需要点击硬件后退按钮。


看起来这个问题已经提交给 Google 的问题跟踪器 here

我刚刚 运行 遇到了同样的问题,这就是我实现它的方式。在进入代码之前,我想快速总结一下。我有一个 activity 和两个片段。其中一个片段是主片段,即应用程序的主屏幕,另一个片段是显示设置的片段。我最终没有使用 SupportFragmentManager (which Google shows in their settings guide),因为我 运行 遇到了同样的问题,视图只会出现在前一个视图的顶部。因此,我只是导航到设置片段,就像您使用 findNavController().navigate(...).

导航到单个 activity 架构中的任何其他片段一样

首先,您需要将适当的依赖项添加到您的应用程序 build.gradle:

dependencies {
    ...
    // androidx Preferences
    implementation "androidx.preference:preference-ktx:1.1.0"

    // androidx Navigation
    implementation 'androidx.navigation:navigation-fragment-ktx:2.2.0'
    implementation 'androidx.navigation:navigation-ui-ktx:2.2.0'

然后我按照 Google's navigation guide

中的描述设置了我的 MainActivity.kt 导航
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        NavigationUI.setupActionBarWithNavController(
            this, this.findNavController(R.id.nav_host_fragment)
        )

    }
    // Allows the up arrow to navigate back to the navigation host fragment.
    override fun onSupportNavigateUp(): Boolean {
        return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp()
    }

}

之后,设置将由 MainActivity.kt 托管的片段。这个片段是当你打开你的应用程序时会出现的。我叫我的 MainFragment.kt。有关创建在单击工具栏中的三点图标时膨胀的下拉菜单的帮助,请参阅 Google's menu guide

class MainFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Show the three dot icon in the top right had corner of the toolbar
        setHasOptionsMenu(true)
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {

            // Navigate to the settings fragment when the options menu item is selected
            R.id.settings -> {
                findNavController().navigate(MainFragmentDirections.actionMainToSettings())
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }

    // Inflates menu.xml when the three dot icon is clicked
    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu, menu)
    }
}

最后,设置片段很容易实现。参考 Google 的设置指南(参见上文 link)了解如何设置。

class MySettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

此外,不要忘记在 nav_graph.xml 中连接您的片段。请参考上面 Google 的导航指南 link 以获取相关示例。

希望对您有所帮助!