14

似乎 AppCompat v21 提供 SwitchCompat 不提供 SwitchCompatPreference。

我知道我可以使用 SwitchPreference 但它在视觉上并不相同。在 Android 4.x 上;当我在活动界面上使用 v21 的 SwitchCompact 时,它看起来像材质切换按钮,但是,因为没有 SwitchCompactPreference,我必须在我的偏好视图中使用 SwitchPreference,显然它具有 Android 4.0 外观。

看起来 AppCompact v21 完成了一半。

我错过了什么吗?

4

7 回答 7

10

根据当前接受的答案和 cgollner 的要点,如果您只从那里获取 xml 布局: https ://gist.github.com/cgollner/3c7fe2f9d34aee38bd0c

并这样做:

<CheckBoxPreference
            android:widgetLayout="@layout/preference_switch_layout"
            android:defaultValue="off"
            android:key="key1"
            android:title="@string/title1" />

而不是这个(使用 setWidgetLayoutResource 从源添加布局):

<com.cgollner.unclouded.preferences.SwitchCompatPreference
            android:defaultValue="off"
            android:key="key1"
            android:title="@string/title1" />

然后动画也将在棒棒糖和下面使用相同的 xml 上工作。

于 2015-07-05T11:36:01.827 回答
6

我为自己构建了一些东西,SwitchCompatPreference.java。事实证明,扩展SwitchPreference是构建它的最简单方法。可悲的是,SwitchCompat不继承自Switch,因此原版SwitchPreference需要稍作修改。首选项的使用如下:

<me.barrasso.android.volume.ui.SwitchCompatPreference
        android:icon="@drawable/icon"
        android:key="key"
        android:defaultValue="false"
        android:widgetLayout="@layout/pref_switch"
        android:title="@string/title"
        android:summary="@string/summary" />

布局非常简单,根据需要进行调整。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.SwitchCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/toggle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textIsSelectable="false"
    android:textStyle="bold" />
于 2014-12-19T18:16:31.560 回答
6

这是一个代码片段,即使在旧版本上也能显示材料开关。 https://gist.github.com/cgollner/5b31123c98b2c1cad8dc https://gist.github.com/cgollner/3c7fe2f9d34aee38bd0c

参考: https: //plus.google.com/118168530059850940658/posts/badausxo1J6

于 2015-02-25T15:37:02.290 回答
3

你不会喜欢这个答案,但我能想到的最好方法是从 SwitchCompat 对象创建你自己的偏好:

http://developer.android.com/guide/topics/ui/settings.html#Custom

我知道这个答案不是最好的,而且还没有代码示例。我会在周末尝试解决这个问题,并用我发现的内容更新这个答案。

于 2014-10-31T17:21:09.470 回答
1

缺点:可能不适用于所有设备。


AppCompatDelegate在您的PreferenceActivity(您可以基于类)中使用AppCompatPreferenceActivity并覆盖 onCreateView 以SwitchCompat在创建Switch视图时返回

IE,

public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
    private AppCompatDelegate mDelegate;

    //... other methods omitted for clarity

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        // Allow super to try and create a view first
        final View result = super.onCreateView(name, context, attrs);
        if (result != null) {
            return result;
        }

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            switch (name) {
                // ... can add other views here
                case "Switch":
                    return new SwitchCompat(this, attrs);
            }
        }
        return null;
    }
}

优点是,通过这种方式,您可以在不更改布局的情况下添加对现有应用程序的支持,而且工作量很小。

于 2015-07-22T11:55:51.893 回答
1

这是关于已接受答案中 SwitchCompat 小部件的动画。

我发现问题是由 Preference 类中的一个标志引起的,在 Android 4.0-4.3 中,该标志是 mHasSpecifiedLayout,在 Android 4.4 中,该标志是 mCanRecycleLayout。

当您使用 setWidgetLayoutResource 设置小部件时,它将更改此标志。

如果您使用不同的包名称(android.preference 或 com.android 除外)创建新的自定义首选项类,它也会更改此标志。

当 mHasSpecifiedLayout 为 false 或 CanRecycleLayout 为 true 时,动画将起作用,否则动画不起作用。

所以你可以使用反射而不是 setWidgetLayoutResource() 方法来设置小部件布局,这样动画就不会被破坏。

这是一个片段:

        CheckBoxPreference switchPref = new CheckBoxPreference(getActivity());
        try {
            Field field = Preference.class.getDeclaredField("mWidgetLayoutResId");
            field.setAccessible(true);
            field.setInt(switchPref, R.layout.preference_switch_layout);
        } catch (Exception e) {
            switchPref.setWidgetLayoutResource(R.layout.preference_switch_layout);
        }
        switchPref.setKey(key);
        switchPref.setTitle(titleRes);
        switchPref.setSummary(summaryRes);
        switchPref.setDefaultValue(defaultValue);
于 2015-10-04T09:28:00.940 回答
-2

来自官方 Android 博客

如何将 AppCompat 与首选项一起使用?在 API v11+ 设备上运行时,您
可以继续使用。对于之前的设备,您需要提供一个非材质样式的普通 PreferenceActivity。PreferenceFragmentActionBarActivity

于 2014-10-23T22:28:44.700 回答