SwitchPreferenceCompat:android:switchTextOff/switchTextOn不起作用

Sim*_*mon 5 android switchpreference

我正在尝试显示一个switchPreference,它允许用户根据里程或公里显示距离.我正在使用SwitchPreferenceCompat支持库.根据库,我可以使用textSwitchOff和textSwitchOn向开关添加文本.我只想在我的交换机上添加"km"或"miles",以便用户知道显示哪个指标.

根据这个文档,我需要的只是下面的代码:

<android.support.v7.preference.PreferenceCategory
    android:layout="@layout/preferences_category"
    android:title="Distance" >

    <android.support.v7.preference.SwitchPreferenceCompat android:title="KM or Miles"
        android:key="kmormiles"
        android:switchTextOff="miles"
        android:switchTextOn="km"
        android:defaultValue="true"/>

</android.support.v7.preference.PreferenceCategory>
Run Code Online (Sandbox Code Playgroud)

但是,开关看起来像普通开关,开关本身没有额外的文字.

在此输入图像描述

如何使用textOn和textOff显示它?

我也尝试过以下方法:

    addPreferencesFromResource(R.xml.preferences);
    kmormiles = (SwitchPreferenceCompat) findPreference("kmormiles");
    kmormiles.setSwitchTextOff("Km");
    kmormiles.setSwitchTextOn("miles");
Run Code Online (Sandbox Code Playgroud)

仍然无法正常工作.我正在尝试两种不同的genymotion模拟器,API 16和API 21.

tyn*_*ynn 7

由于默认SwitchPreferenceCompat使用SwitchCompat小部件,Android Switch小部件textOn和textOff在Lollipop不起作用也有一个应用程序.并且第一个声明

默认情况下,材料主题下不显示文本,因为切换窗口小部件资产不能很好地与文本一起使用.

还解释了为什么结果看起来并不好看.

SwitchPreferenceCompat类本身不提供一种可能性,设置开/关文是否应该显示.因此,使其工作的onBindViewHolder(PreferenceViewHolder)一种方法可能是重写方法以编程方式设置它.

另一个也许更好的方法是利用你必须与偏好compat库一起使用的主题机制.您不能直接为视图设置任何属性,但可以定义要使用的布局android:widgetLayout.所以只需创建自己的首选项主题叠加层

<style name="MyPreferenceThemeOverlay" parent="PreferenceThemeOverlay">
    <item name="switchPreferenceCompatStyle">@style/MySwitchPreferenceCompat</item>
</style>
Run Code Online (Sandbox Code Playgroud)

使用您自己的开关首选项样式

<style name="MySwitchPreferenceCompat" parent="Preference.SwitchPreferenceCompat">
    <item name="android:widgetLayout">@layout/pref_stack</item>
</style>
Run Code Online (Sandbox Code Playgroud)

使用略微修改的默认开关布局

<android.support.v7.widget.SwitchCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/switchWidget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:clickable="false"
    android:focusable="false"
    app:showText="true" />
Run Code Online (Sandbox Code Playgroud)

您应该记住代码的另一件事是compat功能本身.通过android.support.v7.preference.SwitchPreferenceCompat明确使用,您永远不会获得更适合于inflater自动了解的新设备的版本,就像当前唯一可用的替代品一样android.support.v14.preference.SwitchPreferenceCompat.这可能涉及到你方面的更多工作.

编辑:这是海报实施上述建议的结果,正如他提到的那样,结果看起来并不好看:

在此输入图像描述

在此输入图像描述