2015-08-18 3 views
47

Zusammen mit der M-Version gibt es neue Support-Bibliotheken. Einer von ihnen, der sehr nützlich scheint, ist die v7 Preference Support Bibliothek.Wie wird die v7/v14 Preference Support-Bibliothek verwendet?

Es scheint nicht PreferenceActivity oder etwas ähnliches zu haben, wie integrieren wir es in unsere App?

+0

Sie haben PreferenceFragment vom android.preference Paket richtig? –

+4

https://plus.google.com/+AndroidDevelopers/posts/9kZ3SsXdT2T –

+0

https://github.com/codevscolor/MaterialPreference Ich habe diese Bibliothek implementiert, die verwendet werden kann, um die Materialpräferenz einfach zu erstellen (v7 preference compat wird hier verwendet)) – codevscolor

Antwort

85

Sie müssen AppCompatActivity, die für Fragment erforderlich ist, erweitern und eine Unterklasse von PreferenceFragmentCompat einschließen. Das abstrakte Fragment muss eine Methode überschreiben, in der Sie Ihre Präferenz-Inflationslogik platzieren sollten. Und zuletzt muss Ihr Aktivitätsthema ein preferenceTheme Attribut angeben.

Lesen Sie die Ankündigung here. Bevorzugt-v7-Bibliothek können Sie PreferenceFragment (API 11+) mit PreferenceFragmentCompat Unterklasse zu ersetzen, und SwitchPreference (API 14+) mit SwitchPreferenceCompat und haben Ihre Einstellungen Bildschirmarbeit von API 7.

Unten ist, wie ich es Arbeit gemacht:

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
    } 
} 

Layout/activity_settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent" > 
    <fragment 
     android:name=".SettingsFragment" 
     android:tag=".SettingsFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</FrameLayout> 

SettingsFragment.java

public class SettingsFragment extends PreferenceFragmentCompat { 

    @Override 
    public void onCreatePreferences(Bundle bundle, String s) { 
     addPreferencesFromResource(R.xml.preferences); 
    } 
} 

xml/preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <android.support.v7.preference.PreferenceCategory 
     ...> 

     <android.support.v7.preference.ListPreference 
      ... /> 

     <android.support.v7.preference.SwitchPreferenceCompat 
      ... /> 

     ... 

    </android.support.v7.preference.PreferenceCategory> 

    ... 

</android.support.v7.preference.PreferenceScreen> 

Werte/Stile. xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> 
    ... 
</style> 

Präferenz-v7 Standard-Theme

<style name="PreferenceThemeOverlay"> 
    <item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item> 
    <item name="preferenceFragmentStyle">@style/PreferenceFragment</item> 
    <item name="preferenceCategoryStyle">@style/Preference.Category</item> 
    <item name="preferenceStyle">@style/Preference</item> 
    <item name="preferenceInformationStyle">@style/Preference.Information</item> 
    <item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item> 
    <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item> 
    <item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item> 
    <item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item> 
    <item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item> 
</style> 
+1

@hidro Nun. Das funktioniert nicht. Dies führt zu einer Ausnahme, die sich wie folgt zusammensetzt: java.lang.ClassNotFoundException: android.view.fragment. – f470071

+0

Arbeitete für mich ... –

+0

Wie kann ich diese v7.preference verwenden? –

0

Sie haben recht, es ist nicht auf der appcompat v7 vorhanden, aber Google hat AppCompatDelegate abstrakte Klasse als Delegat hinzugefügt, die Sie verwenden können, um die Unterstützung von AppCompat für jede Aktivität zu injizieren. Sie können mehr von this answer finden.

Dies ist ein Beispiel dafür, wie Sie die AppCompatDelegate aus den AppCompat-Beispielen von Google in Ihre Aktivität einfügen können. Sie finden sie unter here.

+2

Dies steht in keinem Zusammenhang mit der Präferenz-Unterstützungsbibliothek, da native 'PreferenceActivity', auf der diese' AppCompatPreferenceActivity' basiert, in keiner Weise mit Klassen arbeitet, die in 'preference-v7' library eingeführt wurden. Diese Methode bietet Ihnen nur thematische Widgets auf allen Plattformen, aber keine konsistenten Einstellungen für Voreinstellungen wie Ränder, Schriftgrößen oder das Layout von Elementen im Allgemeinen. –

8

Mit der neuen Vorzugs Support-Bibliothek v7 Sie die PreferenceFragmentCompat mit jedem Activity oder AppCompatActivity

public static class PrefsFragment extends PreferenceFragmentCompat { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.preferences); 
    } 
} 

Sie müssen preferenceTheme in Ihrem Thema einstellen können:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light"> 
    ... 
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> 
</style> 

Auf diese Weise Sie anpassen können die preferenceTheme, um die Layouts für jeden Präferenztyp zu formatieren, ohne andere Teile Ihrer Aktivität zu beeinflussen.

+10

Das ist falsch und verursachte mir 30 Minuten Kopfschmerzen. 'PreferenceFragmentCompat' sollte' onCreate (Bundle b) 'nicht überschreiben, es sollte' onCreatePreferences (Bundle Bundle, String s) überschreiben ' –

0

Ich versuchte Hidro Antwort oben mit einer Aktivität, die auch eine Symbolleiste enthalten und es gab mir die folgende Layout Inflation Ausnahme zu implementieren, da der der folgende Fehler:

Ich habe nicht in der Lage, diese zu lösen, so habe ich auf die fo zurückgegriffen llowing:

public class SettingsActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState == null) 
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new SettingsFragment()).commit(); 
    } 
} 

Mit folgendem Layout für die SettingsActivity:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 
    <include layout="@layout/toolbar"/> 
    <FrameLayout android:id="@+id/fragment_container" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
</android.support.design.widget.CoordinatorLayout> 

hier bekannt gemacht, wie es helfen kann, wenn andere Leute die gleiche Ausnahme Antwort

7

hidro Begegnung richtig ist aber eine Sache hier zu bemerken:

Verwenden Sie einfach normale Präferenz XML-Tags wie PreferenceScreen anstelle der vollen Klasse n ein Ich. Die Support-Bibliothek konvertiert sie automatisch.

Warum: Wenn Sie den vollständigen Klassennamen verwenden, funktioniert der Codevorschlag und die Layoutvorschau nicht richtig.

So sollten Sie xml wie folgt schreiben:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

    <PreferenceCategory 
     ...> 

     <ListPreference 
      ... /> 

     <SwitchPreferenceCompat 
      ... /> 

     ... 

    </PreferenceCategory> 

    ... 

</PreferenceScreen> 
+0

Woher wissen Sie, dass die Tags durch Gegenstücke der Support-Bibliothek ersetzt werden? –

+1

@ sfk92fksdf Der Quellcode ist hier: https://android.googlesource.com/platform/frameworks/support/+/84765ea/v7/preference/src/android/support/v7/preference/PreferenceInflater.java#216 Das zweite Parameter-Präfix befindet sich in Zeile 64 'init (PreferenceManager preferenceManager)' genau wie 'setDefaultPackages (new String [] {" android.support.v7.preference. "});' –

+0

interessant, danke. Obwohl ich mich nicht auf Implementierungsdetails verlassen würde :-) –

Verwandte Themen