PreferenceFragmentCompat membutuhkan preferenceTheme untuk disetel


114

Dengan PreferenceFragmentCompat baru dari v7 Preference Support Library: http://developer.android.com/tools/support-library/features.html#v7-preference , saya mendapatkan kesalahan ini

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

Tema apa yang harus ditetapkan?

Pembaruan: Saya telah mencoba menggunakan

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

seperti yang disarankan oleh @Bogato tetapi tidak terlihat benar dan terlihat sangat Holo bahkan di Lollipop.

Pustaka dukungan:

masukkan deskripsi gambar di sini

Preferensi asli:

masukkan deskripsi gambar di sini


2
Ada bug tentang dokumentasi untuk ini di sini: code.google.com/p/android/issues/…
Intrications

1
Secara pribadi saya tidak berpikir bahwa solusi ini sepadan dengan penyelesaiannya. Coba github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Bisakah Anda menandai stackoverflow.com/a/44236460/238753 sebagai jawaban yang diterima?
Sam

Jawaban:


159

Proyek sampel dapat ditemukan di sini

Perbaikan bug tersedia sebagai dependensi gradle

Unduh

Sekarang seseorang dapat menggunakan perpustakaan dengan cukup mudah. Berikut adalah cara tercepat untuk melakukannya, tetapi Anda harus membaca README untuk info lebih lanjut.

1. Perbarui file gradle modul Anda:

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

2. Gunakan kelas yang sesuai sebagai basis fragmen Anda

Anda dapat menggunakan salah satu PreferenceFragmentCompatatau PreferenceFragmentCompatDividers.

( Hati-hati dengan nama paket yang sesuai saat mengimpor PreferenceFragmentCompat! )

3. Gunakan tema yang sesuai

Setel tema Activity @style/PreferenceFixThemepenampung Anda ke varian , seperti NoActionBar, Light, dll.

Untuk info lebih lanjut dan tip penggunaan, buka halaman proyek .


PS Di bagian ini Anda dapat menemukan solusi rinci yang mengarah pada pembuatan perpustakaan, tetapi saya memutuskan untuk menghapusnya karena mungkin membingungkan. Jika Anda penasaran dengan langkah-langkahnya, Anda masih dapat menemukannya di riwayat revisi jawaban ini.


6
Ukuran teks default terlalu besar, saya mencoba memodifikasinya menggunakan gaya yang Anda tunjukkan tanpa hasil. Apakah Anda mungkin berhasil menyesuaikan ukuran teks?
Tinashe

4
Saya mencoba untuk memasukkan desain material di sana, tetapi tidak benar-benar berhasil ... Apa yang saya temukan selama proses ini adalah bahwa paket preferensi v7 benar-benar kehilangan gaya bertema material, tata letak, dan file lainnya. Sementara itu, v14 berisi beberapa di antaranya, tetapi masalah dengan v14 adalah ia memperluas Fragmen asli, bukan yang mendukung. Saya pikir Google baru saja melakukan kesalahan besar di sini, semoga mereka segera memperbaikinya ...
Gergely Kőrössy

1
Saya mungkin mencoba untuk menempatkan desain material untuk perangkat pra-21 juga, mereka terlihat sama seperti aslinya sekarang.
Gergely Kőrössy

2
Anda juga harus menyebutkan bahwa PreferenceFragmentCompat mengalami error jika dirotasi dengan dialog terbuka. code.google.com/p/android/issues/detail?id=186160
headsvk

21
Ini konyol. Saya membutuhkan lebih sedikit waktu untuk membuat fragmen preferensi dari awal daripada menemukan cara melalui semua bug, solusi, dan pengujian yang diperlukan untuk membuat ini berfungsi 100% pada semua versi.
Edward van Raak

46

Anda harus menentukan Preferensi Tema dalam tema aktivitas preferensi Anda.

Sebagai contoh :

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

PreferenceThemeOverlay adalah tema default yang dilengkapi dengan pustaka dukungan Preference-v7.


14
Ini berfungsi, tetapi tampaknya salah. Font dari elemen preferensi terlalu besar (diuji pada Android 4.1 dan 5.1).

@ mus65 Itulah masalahnya. Saya telah menduga saya harus menggunakan tema itu tetapi kelihatannya buruk. Saya telah menambahkan lebih banyak detail ke pertanyaan asli.
Kerumitan

3
Saya telah memilih ini sebagai jawaban yang benar karena itu adalah jawaban pertama yang mengatakan tema yang benar untuk disetel. Namun pustaka dukungan perlu diperbaiki sehingga preferensi menggunakan desain material sesuai dengan code.google.com/p/android/issues/detail?id=183376
Intrications

Bagaimana cara membuat tema terlihat material-design? Saat ini itu menunjukkan tampilan asli untuk saya ...
pengembang android

1
Baca jawaban saya di bawah.
Gergely Kőrössy

35

Sepertinya Google memperbaiki masalah ini. Saya telah menguji ini dengan preferensi v14-support versi 25.3.1

1) Tambahkan implementation 'com.android.support:preference-v14:25.3.1'ke Gradle Anda.

2) Tambahkan PreferenceThemeOverlay.v14.Materialke gaya, bukan PreferenceThemeOverlay.

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

3) Terakhir, tambahkan gaya ke Manifest

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

Satu-satunya masalah dengan jawaban ini adalah fragmen preferensi akan menggunakan tema material pada sistem yang menjalankan KitKat dan di bawahnya. Pengaturan preferenceThemeke PreferenceThemeOverlay.v14dalam styles.xmldan ke PreferenceThemeOverlay.v14.Materialdalam styles-v21.xmlmemperbaiki masalah.
Jack Meister

@JackMeister Anda sebaiknya hanya menggunakan versi v14 jika Anda menargetkan api level 14 atau lebih tinggi. Ketidakcocokan tema dengan versi yang lebih lama mungkin bukan satu-satunya masalah Anda saat Anda menggunakan v14 dengan level api yang lebih lama.
Jelmer Brands

@JelmerBrands Tentu: Anda tidak boleh menggunakan pustaka dukungan v14 pada sistem yang menjalankan tingkat API di bawah 14. Komentar saya mengasumsikan minSdkVersionantara 14 dan 20.
Jack Meister

Diuji dengan 23.4.0, yang juga berfungsi dengan baik. Menggunakan preferensi v14, bukan preferensi v7, adalah kuncinya.
pengguna149408

14

Untuk menggunakan PreferenceFragmentCompat, Anda harus menyetel preferenceThemetema Anda:

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

Dengan cara ini Anda dapat menyesuaikan preferenceThemegaya tata letak yang digunakan untuk setiap tipe preferensi tanpa mempengaruhi bagian lain dari Aktivitas Anda.


Pastikan Anda menambahkan PreferensiTema ke gaya yang tepat yang ditetapkan sebagai tema untuk aktivitas Anda stackoverflow.com/a/40736138/1572286
Youness

14

Saya baru saja menambahkan baris ini dalam tema dan berfungsi sempurna pada API 19 ke atas.

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

3
Ini adalah solusi yang paling sederhana dan berfungsi, yang tidak memerlukan ketergantungan tambahan. Seharusnya jawaban yang diterima IMHO, karena sebagian besar aplikasi min API 14+
Louis CAD

Studio Android tidak dapat menemukan ini
Denny

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

3

Solusi yang berhasil untuk saya di API 25. Saya memiliki tema default ini:

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

Dan menambahkan baris ini ke dalamnya

<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 sudah ditentukan, saya tidak perlu memasukkannya. Ini bekerja pada perangkat Android 4.x dan 5.x saya sendiri


2

Tambahkan kode ini ke styles.xml Anda dan ubah sesuai. Ini harus bekerja dengan baik.

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

Saya menambahkan item "Preferensi Tema" ke dalam gaya saya dan itu tampaknya memperbaiki masalah:

   <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

Situs paling bermanfaat bagi saya: Medium

Penulis menunjukkan bahwa kita perlu menambahkan dua paket: com.android.support:preference-v7dan com.android.support:preference-v14, karena yang pertama didistribusikan tanpa gaya.

Beri tahu saya jika berhasil


0

"Takisoft Fix" yang diterima tampaknya agak kludgy dan setelah bermain-main dengannya, saya masih belum puas dengan tampilan yang dihasilkan.

Jika Anda memerlukan PreferenceFragmentpustaka dukungan API 9+ , saya sarankan menggunakan Pustaka Dukungan Preferensi Material . Ini bekerja dengan sempurna (setidaknya untuk saya).


0

Masalah terjadi karena AAPT (Alat Pengemasan Aset Android) tidak dapat menemukan beberapa sumber daya.Perbaiki masalah ini sebagai berikut:

1. Salin sumber daya yang diperlukan untuk folder sumber daya baru yang merespons, bernama seperti res_fw_v7_preference atau yang lainnya.

2. Menggunakan gradle untuk membangun aplikasi Anda dan menambahkan beberapa opsi AAPT tambahan di build.gradle (modul) seperti ini:

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:!*~'
    }
    ...
}

Semoga bermanfaat :)


0

Terima kasih @sergio untuk jawabannya, menggunakan <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>alih-alih <item name="preferenceTheme">@style/Preference</item>berfungsi baik untuk saya.

<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

Biarkan saja dan gunakan API 11+.

API 7 sekarang hampir berumur tujuh tahun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.