我已经跟着了
Custom PreferenceCategory Headings
我确实设法获得相同的屏幕,但使用PreferenceFragment !!
我如何为PreferenceFragmentCompat V14 ??
这是我的代码
的 Style.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:listSeparatorTextViewStyle">@style/PreferenceStyle</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
<style name="PreferenceStyle" parent="@android:style/Widget.TextView">
<item name="android:textColor">@color/colorDialogPop</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/text_medium</item>
<item name="android:padding">@dimen/padding_large</item>
<item name="android:layout_marginLeft">@dimen/margin_medium</item>
<item name="android:background">@color/colorAccent</item>
</style>
的 preference.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/heading_general"
android:layout="@layout/settings_text">
<SwitchPreference
android:padding="@dimen/padding_medium"
android:title="@string/enable_push" />
<SwitchPreference
android:padding="@dimen/padding_medium"
android:title="@string/send_email" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/heading_account"
android:layout="@layout/settings_text">
<EditTextPreference
android:padding="@dimen/padding_medium"
android:title="@string/email" />
<EditTextPreference
android:padding="@dimen/padding_medium"
android:title="@string/name" />
</PreferenceCategory>
</PreferenceScreen>
标题文字的布局setting_text.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/PreferenceStyle"
>
</TextView>
答案 0 :(得分:15)
材质样式PreferenceCategory
不使用android:listSeparatorTextViewStyle
。您可以使用不同的布局替换您想要的所有PreferenceCategory
和样式,而不是试图弄乱系统样式。
在res/layout/custom_preference_category.xml
:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/title"
style="@style/CustomPreferenceCategoryText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin_medium" />
在res/values/styles.xml
:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/PreferenceStyle</item>
</style>
<style name="PreferenceStyle" parent="@style/PreferenceThemeOverlay.v14.Material">
<item name="preferenceCategoryStyle">@style/CustomPreferenceCategory</item>
</style>
<style name="CustomPreferenceCategory" parent="@style/Preference.Category">
<item name="android:layout">@layout/custom_preference_category</item>
</style>
<style name="CustomPreferenceCategoryText" parent="@android:style/Widget.TextView">
<!-- Style your PreferenceCategory here. -->
<item name="android:textColor">@color/colorDialogPop</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/text_medium</item>
<item name="android:padding">@dimen/padding_large</item>
<item name="android:background">@color/colorAccent</item>
</style>
答案 1 :(得分:2)
<强>解决强>
我在文本视图周围添加了线性布局,背景在我选择的颜色中可见。
这是代码。
的 settings_text.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="wrap_content">
<TextView
android:id="@android:id/title"
style="@style/CustomPreferenceCategoryText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
的 style.xml 强>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/PreferenceStyle</item>
</style>
<style name="PreferenceStyle" parent="@style/PreferenceThemeOverlay.v14.Material">
<item name="preferenceCategoryStyle">@style/CustomPreferenceCategory</item>
</style>
<style name="CustomPreferenceCategory" parent="@style/Preference.Category">
<item name="android:layout">@layout/settings_text</item>
</style>
<style name="CustomPreferenceCategoryText" parent="@android:style/Widget.TextView">
<item name="android:textColor">@color/colorDialogPop</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/text_medium</item>
<item name="android:padding">@dimen/padding_large</item>
<item name="android:background">@color/colorAccent</item>
</style>
的 preference.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/heading_general">
<SwitchPreference
android:padding="@dimen/padding_medium"
android:title="@string/enable_push" />
<SwitchPreference
android:padding="@dimen/padding_medium"
android:title="@string/send_weekly_email" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/heading_account">
<EditTextPreference
android:padding="@dimen/padding_medium"
android:title="@string/email" />
<EditTextPreference
android:padding="@dimen/padding_medium"
android:title="@string/name" />
</PreferenceCategory>
</PreferenceScreen>
答案 2 :(得分:0)
一个更简单的解决方案是使用android:layout
。
只需在@android:id/title
上使用TextView
来设置标题并添加您可能要使用的任何样式。
这样可以避免处理主题和样式。
<PreferenceCategory
android:title="@string/your_general_title"
android:layout="@layout/your_layout_for_categories"
>
:
</PreferenceCategory
文件your_layout_for_categories.xml
:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<!-- Just to put a simple line above -->
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/itemInactive"
app:layout_constraintBottom_toTopOf="@android:id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:id="@android:id/title"
android:paddingTop="8dp"
android:paddingLeft="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@color/your_own_color"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<!-- or instead of using textColor use your own style -->
</androidx.constraintlayout.widget.ConstraintLayout>
这要简单得多。当然,您应该为所有类别指定android:layout
-这使您可以更好地控制所需的内容,还可以定义不同的布局(如果您使用上述样式,则最终将定义几种样式/每个类别的主题)。
如果您的类别应显示一个图标,请使用ID @android:id/icon
。作为摘要,请使用@android:id/summary
。
最后,如果要使用自定义窗口小部件设置首选项,请使用android:widgetLayout
。
如果要以其他方式呈现首选项,请注意,只有在定义了ID为@android:id/widget_frame
的容器时,窗口小部件(例如SwitchPreference)才会设置。这样,您实际上可以将所有首选项UI组件布置在所需的任何位置。
答案 3 :(得分:0)
这就是我在 Kotlin 中的做法:
class TemporyPreference @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyleAttr: Int = R.attr.preferenceStyle,
defStyleRes: Int = 0
) : Preference(context, attributeSet, defStyleAttr, defStyleRes) {
override fun onBindViewHolder(holder: PreferenceViewHolder?) {
super.onBindViewHolder(holder)
holder?.let {
val textViewTitle = it.findViewById(android.R.id.title) as TextView
val textViewSummary = it.findViewById(android.R.id.summary) as TextView
textViewTitle.typeface = ResourcesCompat.getFont(context, R.font.poppins_medium)
textViewSummary.typeface = ResourcesCompat.getFont(context, R.font.poppins_medium)
}
}
}
class TemporyPreferenceCategory @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyleAttr: Int = R.attr.preferenceCategoryStyle,
defStyleRes: Int = 0
) : PreferenceCategory(context, attributeSet, defStyleAttr, defStyleRes) {
override fun onBindViewHolder(holder: PreferenceViewHolder?) {
super.onBindViewHolder(holder)
holder?.let {
val textViewTitle = it.findViewById(android.R.id.title) as TextView
textViewTitle.typeface = ResourcesCompat.getFont(context, R.font.poppins_semibold)
}
}
}
<PreferenceScreen>
<com.planner.planner.ui.settings.preference.TemporyPreferenceCategory
app:key="other_category"
app:title="Other">
<com.planner.planner.ui.settings.preference.TemporyPreference
app:fragment="com.andreramon.planner.view.settings.imprint.ImprintContentFragment"
app:key="imprint"
app:title="@string/settings_category_about_imprint" />
<com.planner.planner.ui.settings.preference.TemporyPreference
app:key="@string/settings_feedback"
app:summary="@string/settings_feedback_summary"
app:title="@string/settings_feedback" />
</com.planner.planner.ui.settings.preference.TemporyPreferenceCategory>
</PreferenceScreen>