PreferenceFragmentCompat, preferenceTheme'nin ayarlanmasını gerektirir


114

V7 Preference Support Library'den yeni PreferenceFragmentCompat ile: http://developer.android.com/tools/support-library/features.html#v7-preference , bu hatayı alıyorum

E  java.lang.IllegalStateException: Must specify preferenceTheme in theme
E      at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:202)

Hangi tema ayarlanmalıdır?

Güncelleme: kullanmayı denedim

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

@ Bogato tarafından önerildiği gibi, ancak doğru görünmüyor ve Lollipop'ta bile çok Holo görünüyor.

Destek kitaplığı:

görüntü açıklamasını buraya girin

Yerel tercihler:

görüntü açıklamasını buraya girin


2
Bununla ilgili dokümantasyonla ilgili bir hata var: code.google.com/p/android/issues/…
Intrications

1
Şahsen bu çözümlerin geçici çözümlere değeceğini düşünmüyorum. Github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Lütfen stackoverflow.com/a/44236460/238753'ü kabul edilen yanıt olarak işaretleyebilir misiniz ?
Sam

Yanıtlar:


159

Örnek proje burada bulunabilir

Hata düzeltme, kademeli bağımlılık olarak mevcuttur

İndir

Artık kitaplığı kullanmak oldukça kolay. İşte bunu yapmanın en hızlı yolu, ancak daha fazla bilgi için README'ye bakmalısınız.

1. Modülünüzün gradle dosyasını güncelleyin:

compile 'com.takisoft.fix:preference-v7:27.0.0.0'

2. Parçanızın temeli olarak uygun sınıfı kullanın

Ya kullanabilir PreferenceFragmentCompatveya PreferenceFragmentCompatDividers.

( İçe aktarırken uygun paket adına dikkat edin PreferenceFragmentCompat! )

3. Uygun temayı kullanın

İçeren Aktivitenizin temasını @style/PreferenceFixThemeNoActionBar, Light, vb.

Daha fazla bilgi ve kullanım ipuçları için proje sayfasına gidin .


Not: Bu bölümde kitaplığın oluşturulmasına yol açan ayrıntılı çözümü bulabilirsiniz, ancak kafa karıştırıcı olabileceği için onu kaldırmaya karar verdim. Adımları merak ediyorsanız, bunları yine de bu cevabın düzeltme geçmişinde bulabilirsiniz .


6
Varsayılan metin boyutu çok büyük, işaret ettiğiniz bu stilleri kullanarak değiştirmeyi denedim başarılı olamadım. Belki metin boyutunu ayarlamayı başardınız mı?
Tinashe

4
Materyal tasarımını oraya koymaya çalışıyorum ama gerçekten başarılı olamadım ... Süreç boyunca keşfettiğim şey, v7 tercih paketinin materyal temalı stil, düzen ve diğer dosyaların tamamen eksik olması. Bu arada, v14 bunlardan bazılarını içeriyor, ancak v14 ile ilgili sorun, destek olanı değil, yerel Parçayı genişletmesidir. Sanırım Google burada gerçekten büyük bir hata yaptı, umarım en kısa zamanda düzeltirler ...
Gergely Kőrössy

1
21 öncesi cihazlar için de materyal tasarımı uygulamaya koymaya çalışabilirim, şimdi orijinaliyle aynı görünüyorlar.
Gergely Kőrössy

2
Açık bir iletişim kutusu ile döndürüldüğünde PreferenceFragmentCompat'ın çöktüğünü de belirtmelisiniz. code.google.com/p/android/issues/detail?id=186160
headsvk

21
Bu gülünç. Sıfırdan bir tercih parçası yapmak, bunun tüm sürümlerde% 100 çalışmasını sağlamak için gereken tüm hatalar, geçici çözümler ve testler arasında bir yol bulmaktan daha az zaman alırdı.
Edward van Raak

46

Tercih etkinliğinizin temasında PreferenceTheme öğesini belirtmelisiniz.

Örneğin :

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

PreferenceThemeOverlay, Preference-v7 destek kitaplığıyla birlikte gelen varsayılan temadır.


14
Bu işe yarıyor, ancak yanlış görünüyor. Tercih öğelerinin yazı tipleri çok büyük (android 4.1 ve 5.1'de test edildi).

@ mus65 Sorun bu. Bu temayı kullanmam gerektiğini tahmin etmiştim ama kötü görünüyor. Orijinal soruya daha fazla ayrıntı ekledim.
Intrications

3
Bunu doğru cevap olarak seçtim çünkü doğru temayı belirleyen ilk cevap oydu. Ancak destek kitaplığı tercihleri göre malzeme tasarımı kullanmak böylece düzeltilmesi gerekiyor mu code.google.com/p/android/issues/detail?id=183376
Intrications

Temanın materyal tasarımı gibi görünmesini nasıl sağlarım? Şu anda benim için yerel görünümü gösteriyor ...
android geliştiricisi

1
Aşağıdaki cevabımı okuyun.
Gergely Kőrössy

35

Görünüşe göre Google bu sorunu çözdü. Bunu v14 destek sürümü 25.3.1 tercihiyle test ettim

1) implementation 'com.android.support:preference-v14:25.3.1'Gradle'ınıza ekleyin.

2) PreferenceThemeOverlay.v14.MaterialBunun yerine stile ekleyin PreferenceThemeOverlay.

<style name="AppTheme.SettingsTheme" parent="AppTheme.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>

3) Son olarak, Stili Manifesto'ya ekleyin

android:theme="@style/AppTheme.SettingsTheme"

Bu cevapla ilgili tek sorun, tercih parçasının KitKat ve daha altını çalıştıran sistemlerde malzeme temasını kullanmasıdır. Ayarlama preferenceThemeiçin PreferenceThemeOverlay.v14de styles.xmlve PreferenceThemeOverlay.v14.Materialde styles-v21.xmlsorun düzeltmeleri.
Jack Meister

@JackMeister, v14 sürümünü yalnızca API düzeyi 14 veya daha üstünü hedefliyorsanız kullanmalısınız. Eski sürümlerle tema uyumsuzluğu, v14'ü eski api seviyelerinde kullandığınızda tek sorununuz olmayabilir.
Jelmer Brands

@JelmerBrands Elbette: 14'ün altındaki API seviyelerini çalıştıran sistemlerde bir v14 destek kitaplığı kullanmamalısınız. Yorumum minSdkVersion14 ile 20 arasında olduğunu varsayıyor .
Jack Meister

Aynı şekilde çalışan 23.4.0 ile test edilmiştir. Anahtar, v7 tercihini değil, v14 tercihini kullanmaktır.
user149408


14

Bu satırı temaya yeni ekledim ve API 19 ve üzeri için mükemmel çalışıyor.

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

3
Bu, ek bağımlılık gerektirmeyen en basit, çalışan çözümdür. Kabul edilen yanıt IMHO olmalı, artık çoğu uygulama minimum API 14+
Louis CAD

Android stüdyosu bunu bulamıyor
Denny

3
com.android.support:preference-v14 ekleyin: to build.gradle
Sofi Software LLC

3

API 25'te benim için çalışan çözüm. Şu varsayılan temaya sahiptim:

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Ve bu satırı ona ekledi

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

PreferenceThemeOverlay zaten tanımlanmıştı, onu eklemek zorunda değildim. Kendi Android 4.x ve 5.x cihazlarında çalıştı


2

Bu kodu styles.xml dosyanıza ekleyin ve buna göre değiştirin. İyi çalışmalı.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

<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

Tarzıma "PreferenceTheme" öğesini ekledim ve bu sorunu çözmüş gibi görünüyordu:

   <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:actionBarStyle">@style/MyActionBarTheme</item>
     <item name="colorPrimary">@color/ColorPrimary</item>
     <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
     <item name="preferenceTheme">@style/Preference</item>
 </style>

1

Benim için en yararlı site: Orta

Yazar, iki paket eklememiz gerektiğini gösteriyor: com.android.support:preference-v7ve com.android.support:preference-v14çünkü ilk paket stiller olmadan dağıtılıyor.

Çalışırsa beni bilgilendir


0

Kabul edilen "Takisoft Fix" oldukça kaba görünüyor ve onunla oynadıktan sonra ortaya çıkan görünümden hala memnun değilim.

API 9+ PreferenceFragmentdestek kitaplığına ihtiyacınız varsa , Malzeme Tercihi Destek Kitaplığı kullanmanızı öneririm . Mükemmel çalışıyor (en azından benim için).


0

Sorun, AAPT'nin (Android Varlık Paketleme Aracı) bazı kaynakları bulamaması nedeniyle oluşur. Bu sorunu aşağıdaki gibi düzeltin:

1. res_fw_v7_preference veya başka bir şey gibi adlandırılan yeni bir yanıt veren kaynak klasörüne gerekli olan kaynakları kopyalayın.

2. Uygulamanızı oluşturmak ve build.gradle'da (modüllerin) bazı ek AAPT seçenekleri eklemek için gradle'ı kullanarak aşağıdaki gibi:

android {
    ...
    aaptOptions {
        additionalParameters '-S',
            'src/main/res_fw_v17_leanback',  // resources in frameworks/support/v17/leanback
            '-S',
            'src/main/res_fw_v7_preference',  // resources in frameworks/support/v7/preference
            '-S',
            'src/main/res_fw_v14_preference',  // resources in frameworks/support/v14/preference
            '-S',
            'src/main/res_fw_v17_preference-leanback',  // resources in frameworks/support/v17/preference-leanback
            '-S',
            'src/main/res_fw_v7_appcompat',  // resources in frameworks/support/v7/appcompat
            '-S',
            'src/main/res_fw_v7_recyclerview',  // resources in frameworks/support/v7/recyclerview
            '-S',
            'src/main/res',  // resources in your application
            '--auto-add-overlay',
            '--extra-packages',
            'android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview'
    noCompress 'foo', 'bar'
    ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
    }
    ...
}

Umarım bu yardımcı olur :)


0

Cevap için teşekkürler @sergio, benim için harika işler <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>yerine kullanıyor <item name="preferenceTheme">@style/Preference</item>.

<style name="IntentTheme" parent="Theme.AppCompat">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:actionModeBackground">@color/fulltransparent</item>
        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

-8

Bırakın ve API 11+ kullanın.

API 7 şu anda neredeyse yedi yaşında.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.