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

问题描述 投票:0回答:3

我正在尝试使用带有工具栏的 Android Jetpack Settings 指南。指南说根标签是 ,所以我不能在 xml 中包含工具栏。我正在使用 NoActionBar 主题。根据 Android Jetpack guide 支持应用栏变体,建议从 Activity 中删除顶部栏,并在每个目标片段中定义它。所以我有以下文件:

首选项.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>

SettingsFragment.kt

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

一切运行良好,settingsFragments 打开得很好,但因为我确实使用 NoActionBar 主题,所以似乎没有办法在 main_activity 中定义工具栏的情况下添加工具栏。我的评估是否正确,或者有没有办法让我在首选项片段中添加自定义工具栏?

android android-actionbar android-toolbar android-preferences
3个回答
9
投票

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

  • 定义偏好主题:
<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>

然后在您的 SettingsFragment 中,您可以通过 id 找到工具栏并对其进行所有自定义:

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

2
投票

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

我正在谈论的一段代码:

<PreferenceCategory
        android:title="Prueba"
        android:textSize="10dp"
        android:layout="@layout/activity_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>

0
投票
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);
}}

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

© www.soinside.com 2019 - 2024. All rights reserved.