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 以获取相关示例。
希望对您有所帮助!
是否有将 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(...)
.
首先,您需要将适当的依赖项添加到您的应用程序 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 以获取相关示例。
希望对您有所帮助!