【问题标题】:Android: Preference StyleAndroid:偏好风格
【发布时间】:2010-09-28 19:46:22
【问题描述】:
我做了一个自定义首选项(即具有自定义布局的首选项),它显示在 PreferenceActivity 的首选项列表中。
布局是在代码中创建的。问题是在代码中创建的 TextView 的字体看起来与 Android 的标准偏好字体有些不同。
所以解决方案是将android偏好的样式属性应用于我的TextView。各自的样式应该是preferenceScreenStyle 或preferenceStyle(我不确定)。
我的问题是我不知道如何读出 android 的标准样式属性,所以我可以在代码中设置它们。
【问题讨论】:
标签:
android
coding-style
styles
sharedpreferences
【解决方案1】:
我也有同样的问题,但我在某些移动设备(HTC Saphire 和三星 Galaxy S)上解决了这个问题,但我的 HTC Desire HD 有问题。您可以在 android_SDK_resurces/layout/preference.xml 中看到标准偏好样式。有边距,文本大小,......
【解决方案2】:
为死灵道歉,但我无法在任何关于偏好样式的 SO 问题上找到这个答案。我终于找到了答案:默认首选项现在使用layout/preference_material。您可以在 android 源代码here 中看到它和其他更具体的布局。复制如下,以防链接中断:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Layout for a Preference in a PreferenceActivity. The
Preference is able to place a specific widget for its particular
type in the "widget_frame" layout. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
android:paddingStart="?attr/listPreferredItemPaddingStart"
android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:background="?attr/activatedBackgroundIndicator"
android:clipToPadding="false">
<LinearLayout
android:id="@+id/icon_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="-4dp"
android:minWidth="60dp"
android:gravity="start|center_vertical"
android:orientation="horizontal"
android:paddingEnd="12dp"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<com.android.internal.widget.PreferenceImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="48dp"
android:maxHeight="48dp" />
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?attr/textAppearanceListItem"
android:ellipsize="marquee" />
<TextView android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_alignStart="@id/title"
android:textAppearance="?attr/textAppearanceListItemSecondary"
android:textColor="?attr/textColorSecondary"
android:maxLines="10"
android:ellipsize="end" />
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
<LinearLayout android:id="@+id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="end|center_vertical"
android:paddingStart="16dp"
android:orientation="vertical" />
</LinearLayout>
【解决方案3】:
我已经设法解决了这个问题,方法是将当前自定义首选项的布局资源替换为标准首选项使用的布局资源,例如 EditTextPreference,例如这是一个代码示例,请注意 TimePreference 是自定义首选项。
TimePreference wake_time = (TimePreference)findPreference("wake_time");
EditTextPreference exercise = (EditTextPreference)findPreference("exercise");
int r = exercise.getLayoutResource();
wake_time.setLayoutResource(r);