Android AppCompat v21 предоставляет SwitchCompat не предоставляет SwitchCompatPerefrence
Кажется, AppCompat v21 предоставляет SwitchCompat не предоставляет SwitchCompatPerefrence.
Я знаю, что могу использовать SwitchPreference, но он не визуально идентичен. На Android 4.x; когда я использую SwitchCompact от v21 в интерфейсе активности, он выглядит как кнопка переключения материала, но, поскольку нет SwitchCompactPreference, я должен использовать SwitchPreference в моем представлении о перцепциях и, очевидно, имеет вид Android 4.0.
Похоже, что AppCompact v21 полностью завершен.
Я что-то упустил?
Ответы
Ответ 1
Вот фрагмент кода, отображающий материал Переключатели даже в более старых версиях.
https://gist.github.com/cgollner/5b31123c98b2c1cad8dc
https://gist.github.com/cgollner/3c7fe2f9d34aee38bd0c
Ссылка: https://plus.google.com/118168530059850940658/posts/badausxo1J6
Ответ 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, которая не является материальной.