将工具栏添加到首选项屏幕片段



我正在尝试使用带有工具栏的Android Jetpack设置指南。指南说根标签是<偏好屏幕>,所以我不能在xml中包含工具栏。我使用的是NoActionBar主题。根据Android Jetpack支持应用程序栏变体指南,建议从活动中删除顶部栏,而是在每个目的地片段中定义它。所以我有以下文件:

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreferenceCompat
app:key="notifications"
app:title="Enable message notifications" />
<Preference
app:key="feedback"
app:summary="Report technical issues or suggest new features"
app:title="Send feedback" />

</PreferenceScreen>

设置碎片.kt

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

一切运行良好,设置碎片打开良好,但由于我确实使用了NoActionBar主题,如果不在main_activity中定义工具栏,我似乎无法添加工具栏。我的评估是否正确,或者有没有办法在偏好片段中添加自定义工具栏?

也许为时已晚,但你可以通过这种方式实现它->

  • 定义偏好主题:
<style name="PrefsTheme" parent="PreferenceThemeOverlay.v14.Material">
<item name="android:layout">@layout/fragment_settings</item>
</style>
  • fragment_settings.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/item_toolbar" />
<!-- the id is defined by the support lib. -->
<FrameLayout
android:id="@android:id/list_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:targetApi="n" />
</LinearLayout>
  • 在应用程序主题中设置它:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="preferenceTheme">@style/PrefsTheme</item>
</style>

然后在设置页面中,您可以按id找到工具栏,并对其进行所有自定义:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Toolbar>(R.id.toolbar)?.let {
// Customize toolbar 
}
} 

此问题的其他选项。在"首选项屏幕"中,您可以使用"首选项类别",其中包含布局属性。

我说的一段代码:

<PreferenceCategory
android:title="Prueba"
android:textSize="10dp"
android:layout="@layout/activity_titulo"
/>

活动代码_titulo:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".activities.NuevoParteActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/id_cabecera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Theme.GVenaPDA.AppBarOverlay">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="?actionBarSize"
android:padding="@dimen/appbar_padding"
android:text="@string/app_name"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" />
<TextView
android:id="@+id/settings_general"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:text="@string/cabecera_info"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Menu"
/>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
class SettingsFragment : PreferenceFragmentCompat() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val root = ((listView.parent as FrameLayout).parent as LinearLayout)
val toolbar = LayoutInflater.from(requireContext())
.inflate(R.layout.toolbar, root, false) as MaterialToolbar
toolbar.title = getText(R.string.title_settings)
root.addView(toolbar, 0)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.preferences);
}}

您可以在preference.xml膨胀后动态添加工具栏视图。我尝试了@Yerón Barreiro Martínez的解决方案。但是,我无法访问片段页面上的工具栏实例。所以我不能设置标题或点击监听器。

最新更新