Android AppCompat v21 предоставляет SwitchCompat не предоставляет SwitchCompatPerefrence

Кажется, AppCompat v21 предоставляет SwitchCompat не предоставляет SwitchCompatPerefrence.

Я знаю, что могу использовать SwitchPreference, но он не визуально идентичен. На Android 4.x; когда я использую SwitchCompact от v21 в интерфейсе активности, он выглядит как кнопка переключения материала, но, поскольку нет SwitchCompactPreference, я должен использовать SwitchPreference в моем представлении о перцепциях и, очевидно, имеет вид Android 4.0.

Похоже, что AppCompact v21 полностью завершен.

Я что-то упустил?

Ответы

Ответ 2

В соответствии с принятым в настоящее время ответом и cgollner gist, если вы используете только 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.

Ответ 3

Я создаю для себя кое-что, 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" />

Ответ 4

Вам не понравится этот ответ, но лучшим способом, который я могу придумать, является создание ваших собственных предпочтений с объекта SwitchCompat:

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

Я знаю, что этот ответ не самый лучший, и пока нет примеров кода. Я попытаюсь работать над ним в выходные и обновить этот ответ тем, что я нахожу.

Ответ 5

CONS. Может не работать на каждом устройстве.


Используйте AppCompatDelegate в PreferenceActivity (вы можете использовать класс из AppCompatPreferenceActivity) и переопределить onCreateView для возврата SwitchCompat при создании представления Switch

то есть.,

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;
    }
}

Преимущество заключается в том, что таким образом вы можете добавить поддержку существующих приложений без изменения макетов и минимальных усилий.

Ответ 6

Это о анимации для виджета SwitchCompat в принятом ответе.

Я обнаружил, что проблема вызвана флагом в классе Preference, в Android 4.0-4.3, квартира mHasSpecifiedLayout, в Android 4.4 квартира mCanRecycleLayout.

Когда вы установите виджет с помощью setWidgetLayoutResource, он изменит этот флаг.

Если вы создаете новый настраиваемый класс предпочтений, используя другое имя пакета (кроме android.preference или com.android), он также изменит этот флаг.

Когда mHasSpecifiedLayout имеет значение false или CanRecycleLayout истинно, анимация будет работать, иначе анимация не будет работать.

Таким образом, вы можете установить макет виджетов, используя отражение вместо метода 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);

Ответ 7

В официальном блоге Android :

Как использовать AppCompat с настройками?
Вы можете продолжать использовать PreferenceFragment в своем ActionBarActivity при работе на устройстве API v11+. Для устройств до этого вам нужно будет предоставить нормальную функцию PreferenceActivity, которая не является материальной.