2015-08-18 26 views
47

M sürümü ile birlikte yeni destek kitaplıkları var. Bunlardan biri çok yararlı görünüyor gibi görünüyor v7 Preference Support kütüphanesi.v7/v14 Tercih Destek kütüphanesi nasıl kullanılır?

PreferenceActivity veya benzeri bir şey yok gibi görünüyor, nasıl bizim app ile entegre edeceğiz?

+0

:

Yani böyle xml yazmalıyım? –

+4

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

+0

https://github.com/codevscolor/MaterialPreference Kolayca malzeme tercihi oluşturmak için kullanılabilecek bu kütüphaneyi uyguladım (v7 tercihli uyumluluk burada kullanılır – codevscolor

cevap

85

Parça için gerekli olan AppCompatActivity'u uzatmanız ve PreferenceFragmentCompat alt sınıfını içermeniz gerekir. Soyut parça, tercih enflasyonu mantığını yerleştirmeniz gereken bir yöntemi geçersiz kılar. Son olarak, etkinlik temanızın bir preferenceTheme özniteliğini belirtmesi gerekiyor.

Duyuruyu okuyun here. Ben o iş yapılmış ne kadar tercih-v7 kütüphane ile SwitchPreferenceCompat ile PreferenceFragment (API 11+) PreferenceFragmentCompat alt sınıf ile ve SwitchPreference (API 14+) değiştirin ve 7. Aşağıda

senin ayarları API ekran işi olabilir:

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity { 

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

düzen/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> 

değerler/stilleri.xml

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

tercihi-v7 varsayılan tema

<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 Well geçersiz kılmalıdır. Bu çalışmıyor. Hangi aşağı kaynar istisna sonuçlanır: java.lang.ClassNotFoundException: android.view.fragment. – f470071

+0

Çalıştığım için ... –

+0

Bu v7.preferansı nasıl kullanabilirim? –

0

Haklısınız, appcompat v7'de yok, ancak Google aslında AppCompat'ın desteğini herhangi bir etkinliğe enjekte etmek için kullanabileceğiniz bir temsilci olarak AppCompatDelegate özet sınıfını ekledi. this answer'dan daha fazlasını bulabilirsiniz.

Bu, AppCompatDelegate öğesinin, AppCompat'ın Google'daki örneklerinden etkinliğinize nasıl enjekte edileceğinin bir örneğidir, here. Özelleştirebileceğiniz Bu şekilde

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

: Eğer Kendi tema preferenceTheme belirlemek zorunda herhangi Activity veya 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); 
    } 
} 

ile PreferenceFragmentCompat kullanabilirsiniz v7 yeni tercihi destek kütüphanesi ile

+2

Bu, "AppCompatPreferenceActivity" öğesinin temel aldığı "preferenceActivity" tercihi olan destek kitaplığı ile ilgisi yoktur, çünkü preference-v7 'kütüphanesinde tanıtılan sınıflarla hiçbir şekilde çalışmaz. Bu yöntem, yalnızca tüm platformlarda materyal temalı widget'lar sunacaktır, ancak tutarlı bir tercih öğesi görünümü değil - kenar boşlukları, yazı tipi boyutları, genel olarak öğe düzeni. –

8

preferenceTheme, Aktivitenizin diğer bölümlerini etkilemeden her tercih türü için kullanılan düzenleri biçimlendirir.

+10

Bu yanlış ve 30 dakika baş ağrısına neden oldu. 'PreferenceFragmentCompat', onCreate (Bundle b)' yi geçersiz kılmamalıdır, onCreatePreferences'ı (Bundle bundle, String s) ' –

0

Ben de bir araç çubuğu içeren bir etkinlikle yukarıda Hidro cevabını uygulamaya çalıştı ve bunun nedeni bir düzen enflasyon istisna aşağıdaki bana verdi aşağıdaki hata:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentHostCallback.getContext()' on a null object reference

Bunları çözemedim, bu nedenle llowing: SettingsActivity için aşağıdaki düzeni ile

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

:

<?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> 

diğer insanlar burada aynı istisna

7
HIDRO cevabı haklı

ama bir şey daha karşılaşırsanız o yardımcı olabilir burada Yayınlanan fark etmek için:

Tam sınıf n yerine PreferenceScreen gibi normal tercih xml etiketlerini kullanın. ame. Destek kütüphanesi bunları otomatik olarak dönüştürecektir.

Neden: Tam sınıf adını kullanırsanız, öneri ve düzen önizlemesi düzgün çalışmaz. Sen android.preference paket sağdan PreferenceFragment var

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

    <PreferenceCategory 
     ...> 

     <ListPreference 
      ... /> 

     <SwitchPreferenceCompat 
      ... /> 

     ... 

    </PreferenceCategory> 

    ... 

</PreferenceScreen> 
+0

Etiketler, destek kütüphanesi muadilleriyle değiştirileceğini nereden biliyorsunuz? –

+1

@ sfk92fksdf Kaynak kodu şurada: https://android.googlesource.com/platform/frameworks/support/+/84765ea/v7/preference/src/android/support/v7/preference/PreferenceInflater.java#216 İkinci parametre önekleri, 'setDefaultPackages (yeni String [] {"android.support.v7.preference."}); –

+0

gibi, 64 'init (PreferenceManager preferenceManager) satırındadır. Her ne kadar uygulama detaylarına güvenmese de :-) –

İlgili konular