似乎AppCompat v21提供的SwitchCompat不提供SwitchCompatPerefrence.
我知道我可以使用SwitchPreference但它在视觉上并不相同.在Android 4.x上; 当我在活动界面上使用v21的SwitchCompact时,它看起来像是材质切换按钮,但是,因为没有SwitchCompactPreference,我必须在我的pereference视图中使用SwitchPreference,显然它有Android 4.0外观.
它看起来像AppCompact v21半完成.
我错过了什么吗?
因此,我正在更新我的应用程序以完全支持 Monet 和 Material You 指南,并且官方网站提到了开关的新设计。我用了一下,结果是这样的:
我有一个使用 Androidx 首选项库的首选项屏幕,在撰写本文时提供了最新版本,我发现对开关进行主题化的唯一方法(手动主题除外,这没有意义)是在应用程序的主题中使用这一行:
<item name="switchStyle">@style/Widget.Material3.CompoundButton.MaterialSwitch</item>
Run Code Online (Sandbox Code Playgroud)
使用 SwitchPreferenceCompat (它在常规 SwitchPreference 中不起作用)这就是我得到的:
无论宽度如何(不同,但可以更改),禁用状态都完全不同,并且与应用程序的其余部分不匹配。为什么?最重要的是,为什么他们建议使用以下库:
?
我不想太挑剔,但这超出了我的理解范围。
编辑:目前,我在各处使用 switchCompat,以使应用程序统一。查看系统应用程序,我可以找到 4 种不同类型的开关:类似于第二个屏幕截图的自定义开关、旧的开关和本问题中的两种类型。这真是令人困惑。
android styles android-preferences switchpreference material-you
我做了一个简单PreferenceScreen的多重Preference Categorys和CheckBoxPreferences.
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="General">
<CheckBoxPreference
android:title="GPS"
android:key="gps_preference"
android:summary="Enales the GPS tracking of your device"
android:defaultValue="true"
></CheckBoxPreference>
<SwitchPreference
android:title="WLAN"
android:key="wlan_preference"
android:summary="Enables the WLAN usage"
android:defaultValue="true"></SwitchPreference>
<CheckBoxPreference
android:title="Benachrichtigungen"
android:key="benachrichtigung_preference"
android:summary="Enables the Push messages"
android:defaultValue="true"
></CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
此首选项屏幕位于a android.support.v7.preference.PreferenceFragmentCompat.如果我像往常一样离开,那一切都很好.
但是,如果我想转出一个CheckBoxPreference的SwitchPreference(应该通过简单地切换出来的XML标记的工作CheckBoxPreference与SwitchPreference我得到我的渲染错误)design标签:
渲染期间引发异常:android.preference.CheckBoxPreference无法强制转换为android.preference.GenericInflater $ Parent
堆栈跟踪:
android.view.InflateException: Binary XML file line #15: Error inflating class (not found)SwitchPreference
at android.support.v7.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:301)
at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:359)
at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:361)
at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:167) …Run Code Online (Sandbox Code Playgroud) 我正在尝试显示一个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.
Androidx Preference 库提供了两个用于在“设置”屏幕中实现 SwitchPreference 的类:
在撰写此问题时,AOSP 源代码中的两种实现(AOSP Androidx SwitchPreference和AOSP Androidx SwitchPreferenceCompat)看起来几乎相同,除了一些syleables等之外......
所以我的问题是,考虑到与其实现的未来可能发生的变化的兼容性,我们必须使用哪一个
如果我禁用使用setEnabled(false)开关是 (1) 设置为关闭和 (2) 我没有收到OnClickListener启动对话框的响应。
编辑:在这种情况下,我不希望开关自动从开切换到关。
有没有人处理过这个问题?