如何停止我的首选项屏幕,为自定义偏好

时间:2017-05-13 12:30:07

标签: android android-preferences

目前,我的设置活动为我提供了两种字体大小。所有预定义首选项的一个文本大小和一个自定义首选项的文本大小。首选项xml看起来像这样。自定义首选项从Dialog Preference扩展。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <CheckBoxPreference
    android:key="changemode"
    android:title="@string/change_mode"
    android:defaultValue="true"
    android:summary="@string/change_mode_summary"
    />

<org.myapp.settings.NumberPickerPreference
    android:id="@+id/pref_num_picker_pref"
    android:key="@string/number_of_uploads"
    android:title="@string/number_of_uploads"
    />


</PreferenceScreen>

这是什么原因?由于没有任何首选项具有预定义的文本大小,有没有办法解决这个问题而不添加textize属性?

3 个答案:

答案 0 :(得分:0)

如果您膨胀或创建自己的(文本)视图,则应确保它们具有与默认实现相同的样式。

this source layout开始,似乎他们使用textAppearanceMedium作为标题,使用textAppearanceSmall作为摘要。

因此,在标题的自定义布局中,您应该使用

<!-- for title -->
android:textAppearance="?android:attr/textAppearanceMedium"
<!-- for summary or description -->
android:textAppearance="?android:attr/textAppearanceSmall"

如果您只是祈祷创建视图(在这种情况下您可能不应该这样做),您可以使用

// for title
titleView.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium);
// for summary
titleView.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small);

答案 1 :(得分:0)

在用于自定义对话框(扩展DialogPreference的对话框)的类的构造函数中,您必须指定

R.attr.dialogPreferenceStyle

例如:

public class YourPreference extends DialogPreference {

    public YourPreference(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.dialogPreferenceStyle);
    }
 (...) 
}

答案 2 :(得分:0)

添加到@MichaelZet的答案中,我遇到了类似的情况,即PreferenceScreen元素具有3个子元素,分别是switchPreference,List Preference和customTimePreference。 但是customTimePreference是扩展DialogPreference的自定义类。问题在于前两个条目(switchPreference,ListPreference)的标题,摘要textSize小/相同,但是customTimePreference的标题比前两个元素大。

问题是,我的customTimePreference的超级构造函数(DialogPreference构造函数)具有defStyleAttr参数,这是PreferenceScreen的子元素(第三个屏幕项目)和单击的弹出对话框dialogPreference(customTimePreference)的默认样式,我正在传递该属性的值为0,表示不按照下面显示的https://stackoverflow.com/a/6784919/11971304给出的答案查找默认值。

defStyleAttr 当前主题中的一个属性,该属性包含对样式资源的引用,该样式资源为StyledAttributes提供默认值。可以为0表示不查找默认值。

defStyleRes 样式资源的资源标识符,该样式资源提供StyledAttributes的默认值,仅在defStyleAttr为0或在主题中找不到时使用。可以为0表示不查找默认值。

传递android.R.attr.dialogPreferenceStyle使其使用PrefrenceScreen上的默认样式,并与其他元素标题大小的外观保持一致。

 <PreferenceScreen android:title="Settings">
        <SwitchPreference
            android:defaultValue="..."
            android:key="..."
            android:summary="Switch Summary"
            android:title="Enable Switch" />
        <ListPreference
            android:dialogTitle="Please Select"
            android:entries="@array/list_ids"
            android:entryValues="@array/list_values"
            android:key="..."
            android:title="Selection List popup" />

        <com.android.example.customTimePreference
            android:key="..."
            android:title="Clock Dialog popup"/>
    </PreferenceScreen>
public TimePreference(Context context) {
        this(context, null);
        this.context = context;
    }

    public TimePreference(Context context, AttributeSet attrs) {
        //this(context, attrs, 0);       //default not supplied causing incorrect textSize
        this(context, attrs, android.R.attr.dialogPreferenceStyle);
        this.context = context;
    }

    public TimePreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.picker = null;
        setPositiveButtonText(R.string.ok);
        setNegativeButtonText(R.string.cancel);
        this.calendar = new GregorianCalendar();
        this.context = context;
}