Android 匹配自定义首选项的文本样式和填充

Android 匹配自定义首选项的文本样式和填充,android,preference,Android,Preference,在我的应用程序的首选项片段中,我有一个自定义首选项(它是滑块视图首选项)。功能运行良好,但我无法使首选项的视觉外观与其他首选项的视觉外观相匹配 所有搜索都指向使用style=“?android:textAppearanceLarge”,但是这会导致标题字体比其他首选项大得多,并且颜色也不匹配 另外,整个首选项视图中的填充似乎不正确。 我尝试使用style=“?android:preferenceStyle,但这完全没有效果。应用程序使用AppCompat.Light.DarkActionBar主

在我的应用程序的首选项片段中,我有一个自定义首选项(它是滑块视图首选项)。功能运行良好,但我无法使首选项的视觉外观与其他首选项的视觉外观相匹配

所有搜索都指向使用
style=“?android:textAppearanceLarge”
,但是这会导致标题字体比其他首选项大得多,并且颜色也不匹配

另外,整个首选项视图中的填充似乎不正确。 我尝试使用
style=“?android:preferenceStyle
,但这完全没有效果。应用程序使用
AppCompat.Light.DarkActionBar
主题。下面是它的外观。显然,这不好-我需要匹配其他首选项的样式

因此,问题是如何匹配首选项布局的样式,以便在标题上具有正确的填充和字体


更新:在进一步研究之后,我使用
style=“?attr:textAppearanceMedium”
获得了与之匹配的标题样式。我仍在寻找匹配填充的方法。

我知道这篇文章有点老。也许你已经找到了解决方案。但是对于所有其他人(像我一样)有相同问题的人,让我向您展示对我有效的解决方案:

我的首选项类有几个构造函数。其中一个是“2参数构造函数”,它是在扩展XML布局时使用的。 通常是这样的

public MyPrefClass (Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public MyPrefClass(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setWidgetLayoutResource(...)
}
这意味着,将调用3参数构造函数,并将“0”作为StyleAttributes。这将导致在没有显式样式的情况下调用构造函数,即使是在XML中定义的

因此,我所要做的就是将第三个参数更改为所需的样式将2参数构造函数更改为:

public MyPrefClass (Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.dialogPreferenceStyle);
}
这解决了问题。首选项的样式与其他项相同

---编辑----


请确保通过setWidgetLayoutResource而不是setLayoutResource设置布局,因为前者使用小部件布局,而后者膨胀为单独的布局。

我知道这篇文章有点老。也许你已经找到了解决方案。但对于所有其他人(像我一样)有相同问题的人,让我向您展示对我有效的解决方案:

我的首选项类有几个构造函数。其中一个是“2参数构造函数”,它是在扩展XML布局时使用的。 通常是这样的

public MyPrefClass (Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public MyPrefClass(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setWidgetLayoutResource(...)
}
这意味着,将调用3参数构造函数,并将“0”作为StyleAttributes。这将导致在没有显式样式的情况下调用构造函数,即使是在XML中定义的

因此,我所要做的就是将第三个参数更改为所需的样式将2参数构造函数更改为:

public MyPrefClass (Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.dialogPreferenceStyle);
}
这解决了问题。首选项的样式与其他项相同

---编辑----

确保通过setWidgetLayoutResource而不是setLayoutResource设置布局,因为前者使用小部件布局,而后者使用单独的布局