我有一个像这样定义的简单首选项屏幕
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Security">
<CheckBoxPreference
android:title="Require Pin on Start"
android:summary="Require pin to run the application"
android:key="@string/pref_require_pin"
android:defaultValue="false" />
</PreferenceCategory>
<PreferenceCategory android:title="Settings">
<ListPreference
android:title="History Age (in days)"
android:summary="Display items up to 30 days old"
android:key="@string/pref_history_days"
android:defaultValue="30"
android:entries="@array/days_list"
android:entryValues="@array/days_list"
android:dialogTitle="Select History Age"/>
</PreferenceCategory>
</PreferenceScreen>
我已经设置了样式并在我的应用程序的其他地方使用过。
<style name="ListHeader">
<item name="android:textColor">#000000</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">12sp</item>
<item name="android:background">#cccccc</item>
<item name="android:paddingTop">6px</item>
<item name="android:paddingBottom">6px</item>
<item name="android:paddingLeft">12px</item>
</style>
这是我的活动
public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.preferences);
}
}
如何将自定义样式应用于PreferenceCategory
标题?
答案 0 :(得分:57)
你应该看看Preference.Category
风格:
<style name="Preference.Category">
<item name="android:layout">@android:layout/preference_category</item>
<item name="android:shouldDisableView">false</item>
<item name="android:selectable">false</item>
</style>
让我们看一下preference_category.xml
文件:
<!-- Layout used for PreferenceCategory in a PreferenceActivity. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/listSeparatorTextViewStyle"
android:id="@+android:id/title"
/>
因此,您需要创建自定义主题,扩展默认的android Theme
并使用listSeparatorTextViewStyle
样式覆盖ListHeader
值。然后将此主题应用于扩展PreferenceActivity
的活动。
以下是如何做到这一点。
首先,在styles.xml
添加下一个代码:
<style name="PreferenceListHeader"
parent="@android:style/Widget.TextView.ListSeparator">
<item name="android:textColor">#000000</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">12sp</item>
<item name="android:background">#cccccc</item>
<item name="android:paddingTop">6px</item>
<item name="android:paddingBottom">6px</item>
<item name="android:paddingLeft">12px</item>
</style>
<style name="Theme.Custom" parent="@android:style/Theme">
<item name="android:listSeparatorTextViewStyle">@style/PreferenceListHeader</item>
</style>
然后在您的AndroidManifest.xml
添加主题中添加您的偏好设置:
<activity android:name=".MyPreferencesActivity"
android:theme="@style/Theme.Custom"
... >
...
</activity>
以下是截图:
答案 1 :(得分:20)
@inazaruk给出了足够好的答案,但自最近的更新ADT 18 and above
以来,styles
给出了错误的一些限制
Error retrieving parent for item: No resource found that matches the given name '@android:style/Widget.TextView.ListSeparator'.
See this link for reason of the problem and the solution。由于这篇文章没有提供理解代码,我在这里提供我的代码
<style name="Widget.TextView.ListSeparator" parent="@android:style/Widget.TextView">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">14sp</item>
<item name="android:gravity">center_vertical</item>
</style>
<style name="PreferenceListHeader" parent="Widget.TextView.ListSeparator">
<item name="android:textColor">#000000</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">18sp</item>
<item name="android:background">#cccccc</item>
<item name="android:paddingTop">6dp</item>
<item name="android:paddingBottom">6dp</item>
<item name="android:paddingLeft">12dp</item>
</style>
<style name="PreferenceScreen" parent="android:Theme.NoTitleBar">
<item name="android:listSeparatorTextViewStyle">@style/PreferenceListHeader</item>
<item name="android:background">#F2B1DBF3</item>
</style>
答案 2 :(得分:15)
按照inazaruk的回答描述它的样式很简单,但它只改变了标题中文本的样式,它没有提供指定全新布局的方法(样式不会应用{{1} } item)。但是,如果扩展该类,则有一个简单的解决方案:
layout
在定义“首选项”布局时,只需使用此代替原始public class MyPreferenceCategory extends PreferenceCategory {
public MyPreferenceCategory(Context context) {
super(context);
setLayoutResource(R.layout.yourlayout);
}
public MyPreferenceCategory(Context context, AttributeSet attrs) {
super(context, attrs);
setLayoutResource(R.layout.yourlayout);
}
}
。
您的布局当然可以包含您喜欢的任何内容,包括文本上方或下方的行,不同的背景,填充等等。例如,这将显示一个带有上面一行的彩色字幕的材料设计:
PreferenceCategory
答案 3 :(得分:10)
与Gábor的答案相似,但您可以这样做,而不是扩展PreferenceCategory: 1.制作自定义布局。我将其命名为 preference_category.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="6dp"
android:background="?attr/divider_color" />
<TextView
android:id="@+android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="12dp"
android:textColor="?attr/colorAccent"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
重要提示:布局必须包含带有此ID的textview:android:id =“@ + android:id / title”
2.并在首选项中添加以下行:android:layout =“@ layout / preference_category”
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:key="Font_Settings"
android:title="@string/UISetting"
android:layout="@layout/preference_category" >
... // other preferences in the category
</PreferenceCategory>
</PreferenceScreen>