Erweitern von Präferenzklassen in Android Lollipop = Animation erhöhen

Nur für die Erweiterung von CheckBoxPreference oder SwitchPreference auf Android Lollipop, das Widget (das Kontrollkästchen oder der Switch) wird keine Animation mehr haben.

Ich möchte SwitchPreference erweitern, um api <21 zu erzwingen, um SwitchCompat anstelle des Standardeinsatzes zu verwenden, den sie verwenden (was offensichtlich falsch ist).

  • Wake Lock deaktiviert im Vordergrund Service mit Doze-Modus - neue Batterie-Optimierungen in Android M
  • Android Emulator funktioniert nicht?
  • Halten Sie die Aktionsleiste beim Ändern von PreferenceScreen angezeigt
  • Eclipse ADT Fehler: Programm kann nicht heruntergeladen werden
  • Wie kann man Musik im Hintergrund fortsetzen, nachdem der Benutzer die App entfernt hat?
  • Android Gradle Duplicate Dateien kopiert in APK META-INF / license.txt
  • Ich benutze die neue AppCompatPreferenceActivity mit appcompat-v7:22.1.1 aber das scheint die Switches nicht zu beeinflussen.

    Die Sache ist, dass mit nur die Erweiterung dieser Klassen, ohne Hinzufügen eines benutzerdefinierten Layout oder Widget-Ressourcen-Layout, ist die Animation weg.

    Ich weiß, ich kann zwei Instanzen von my preference.xml schreiben (on inside values-v21) und es wird funktionieren … Aber ich würde gerne wissen, warum dies geschieht und wenn jemand eine Lösung kennt, ohne zwei preference.xml zu haben.

    Codebeispiel:

     public class SwitchPreference extends android.preference.SwitchPreference { public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public SwitchPreference(Context context, AttributeSet attrs) { super(context, attrs); } public SwitchPreference(Context context) { super(context); } } 

    Dies oder das gleiche für CheckBoxPreference und dann mit:

    <com.my.package.SwitchPreference />

    Wird die Animation in einem Lollipop-Gerät machen, um weg zu sein.

    Eine andere Sache, die ich für die SwitchPreference versucht habe (das kann ich mit CheckBoxPreference) ist, ein Layout mit der Standard-ID zu geben, aber @android:id/switchWidget ist nicht öffentlich, während @android:id/checkbox ist. Ich weiß auch, dass ich ein <CheckBoxPreference /> und ein Widget-Layout gibt, das tatsächlich ein SwitchCompat ist, aber ich möchte das vermeiden (verwirrend die Namen).

  • Was ist der Standard-Layout Hintergrund
  • Wie zu erwähnen Weg der Bibliotheken in Android.mk Datei oder Application.mk Datei?
  • Wie Set ViewPager in einem Fragment
  • Wie kann man einen Audiodatei-Pfad oder uri vom Gerät in Android abholen?
  • Android Ant bauen auf einem Projekt mit zwei Quellordnern auf
  • Out of Memory Speicher Leck Problem
  • 4 Solutions collect form web for “Erweitern von Präferenzklassen in Android Lollipop = Animation erhöhen”

    Es scheint, ich habe eine Korrektur für Ihr Problem gefunden.

    Umfangreiche Erklärung

    In SwitchCompat , beim Umschalten des Switches, testet er einige Funktionen, bevor er die Animation spielt: getWindowToken() != null && ViewCompat.isLaidOut(this) && isShown() .

    Vollständige Methode:

     @Override public void setChecked(boolean checked) { super.setChecked(checked); // Calling the super method may result in setChecked() getting called // recursively with a different value, so load the REAL value... checked = isChecked(); if (getWindowToken() != null && ViewCompat.isLaidOut(this) && isShown()) { animateThumbToCheckedState(checked); } else { // Immediately move the thumb to the new position. cancelPositionAnimator(); setThumbPosition(checked ? 1 : 0); } } 

    Durch die Verwendung einer benutzerdefinierten Ansicht, die SwitchCompat erweitert , habe ich herausgefunden, dass isShown() immer false zurückgibt, da die bei der dritten Iteration der while , parent == null .

     public boolean isShown() { View current = this; //noinspection ConstantConditions do { if ((current.mViewFlags & VISIBILITY_MASK) != VISIBLE) { return false; } ViewParent parent = current.mParent; if (parent == null) { return false; // We are not attached to the view root } if (!(parent instanceof View)) { return true; } current = (View) parent; } while (current != null); return false; } 

    Interessanterweise ist das dritte übergeordnete getView(View convertView, ViewGroup parent) das zweite Attribut, das an getView(View convertView, ViewGroup parent) in Präferenz übergeben wird , bedeutet, dass der PreferenceGroupAdapter kein Elternteil an sein eigenes getView() . Warum das genau passiert und warum dies nur für kundenspezifische Präferenzklassen geschieht, weiß ich nicht.

    Für meine Testzwecke habe ich die CheckBoxPreference mit einem SwitchCompat als widgetLayout und ich habe auch keine Animationen gesehen.

    Fix

    Jetzt zum Fix: einfach deine eigene Ansicht erweitern SwitchCompat , und überschreibe dein isShown() wie isShown() :

     @Override public boolean isShown() { return getVisibility() == VISIBLE; } 

    Verwenden Sie diese SwitchView für Ihren widgetLayout Stil und Animationen arbeiten wieder: D

    Stile:

     <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> … <item name="android:checkBoxPreferenceStyle">@style/Preference.SwitchView</item> … </style> <style name="Preference.SwitchView"> <item name="android:widgetLayout">@layout/preference_switch_view</item> </style> 

    Widget-Layout:

     <de.Maxr1998.example.preference.SwitchView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:clickable="false" android:focusable="false" /> 

    Manchmal ist die Erweiterung von einer Klasse nicht die beste Lösung. Um zu vermeiden, die Animationen zu verlieren, musst du stattdessen komponieren, ich meinte, eine Klasse zu erstellen, in der du eine SwitchPreference-Feldvariable hast und die neue Logik darauf anwenden kannst. Es ist wie ein Wrapper. Das hat für mich gearbeitet

    Ich schaffe es, es so zu beheben und Animationen arbeiten, bevor es in den Staat direkt ohne Animation ging:

    FIX:

    CustomSwitchCompat.class

     public class CustomSwitchCompat extends SwitchCompat { public CustomSwitchCompat(Context context) { super(context); } public CustomSwitchCompat(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean isShown() { return getVisibility() == VISIBLE; } } 

    In deinem Layout machst das: preference_switch_layout.xml

     <com.example.CustomSwitchCompat xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@android:id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:clickable="false" android:focusable="false" app:switchMinWidth="55dp"/> 

    Und in deiner Präferenz.xml mach das:

     <CheckBoxPreference android:defaultValue="false" android:key="" android:widgetLayout="@layout/preference_switch_layout" android:summary="" android:title="" /> 

    Public class SwitchPreference erweitert android.preference.SwitchPreference {

     public SwitchPreference(Context context) { this(context, null); } public SwitchPreference(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.checkBoxPreferenceStyle); } public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); try { Field canRecycleLayoutField = Preference.class.getDeclaredField("mCanRecycleLayout"); canRecycleLayoutField.setAccessible(true); canRecycleLayoutField.setBoolean(this, true); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.