PreferenceFragmentCompat yêu cầu ưu tiênChủ đề phải được đặt


114

Với PreferenceFragmentCompat mới từ Thư viện hỗ trợ tùy chọn v7: http://developer.android.com/tools/support-library/features.html#v7-preference , tôi gặp lỗi này

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

Chủ đề nào nên được đặt?

Cập nhật: Tôi đã thử sử dụng

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

như được gợi ý bởi @Bogato nhưng nó trông không đúng và trông rất Holo ngay cả trên Lollipop.

Thư viện hỗ trợ:

nhập mô tả hình ảnh ở đây

Tùy chọn gốc:

nhập mô tả hình ảnh ở đây


2
Có một lỗi về tài liệu cho việc này ở đây: code.google.com/p/android/issues/…
Intrications

1
Cá nhân tôi không nghĩ rằng những giải pháp này đáng để thay thế. Hãy thử github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Bạn có thể vui lòng đánh dấu stackoverflow.com/a/44236460/238753 là câu trả lời được chấp nhận không?
Sam

Câu trả lời:


159

Dự án mẫu có thể được tìm thấy tại đây

Bản sửa lỗi có sẵn dưới dạng phụ thuộc gradle

Tải xuống

Bây giờ người ta có thể sử dụng thư viện khá dễ dàng. Đây là cách nhanh nhất để làm như vậy, nhưng bạn nên xem README để biết thêm thông tin.

1. Cập nhật tệp gradle của mô-đun của bạn:

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

2. Sử dụng lớp thích hợp làm cơ sở phân mảnh của bạn

Bạn có thể sử dụng một trong hai PreferenceFragmentCompathoặc PreferenceFragmentCompatDividers.

( Chú ý đến tên gói thích hợp khi nhập PreferenceFragmentCompat! )

3. Sử dụng chủ đề thích hợp

Đặt chủ đề của Hoạt động có chứa của bạn thành một biến thể @style/PreferenceFixTheme, như NoActionBar, Light, v.v.

Để biết thêm thông tin và mẹo sử dụng, hãy truy cập trang của dự án .


Tái bút Trong phần này, bạn có thể tìm thấy giải pháp chi tiết dẫn đến việc tạo thư viện, nhưng tôi quyết định xóa nó vì nó có thể gây nhầm lẫn. Nếu bạn tò mò về các bước, bạn vẫn có thể tìm thấy chúng trong lịch sử sửa đổi của câu trả lời này.


6
Kích thước văn bản mặc định quá lớn, tôi đã thử sửa đổi nó bằng các kiểu bạn đã chỉ ra nhưng không thành công. Có lẽ bạn đã quản lý để điều chỉnh kích thước văn bản?
Tinashe

4
Tôi đang cố gắng đưa material design vào đó, nhưng không thực sự thành công ... Điều tôi phát hiện ra trong quá trình này là gói tùy chọn v7 hoàn toàn thiếu kiểu, bố cục và các tệp khác theo chủ đề material theo chủ đề. Trong khi đó, v14 chứa một số trong số chúng, nhưng vấn đề với v14 là nó mở rộng Fragment gốc chứ không phải hỗ trợ. Tôi nghĩ Google chỉ cần làm một sai lầm thực sự lớn ở đây, hy vọng họ sửa chữa nó càng sớm càng tốt ...
Gergely Kőrössy

1
Tôi cũng có thể thử thiết kế material design cho các thiết bị trước 21, chúng trông giống như bản gốc bây giờ.
Gergely Kőrössy

2
Bạn cũng nên đề cập rằng PreferenceFragmentCompat bị treo nếu được xoay với hộp thoại đang mở. code.google.com/p/android/issues/detail?id=186160
headsvk

21
Chuyện này thật vớ vẩn. Tôi sẽ mất ít thời gian hơn để tạo một phân đoạn tùy chọn từ đầu hơn là tìm cách vượt qua tất cả các lỗi, cách giải quyết và thử nghiệm cần thiết để làm cho điều này hoạt động 100% trên tất cả các phiên bản.
Edward van Raak

46

Bạn phải chỉ định tùy chọn Chủ đề trong chủ đề của hoạt động tùy chọn của bạn.

Ví dụ :

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

PreferenceThemeOverlay là chủ đề mặc định đi kèm với thư viện hỗ trợ ưu đãi-v7.


14
Điều này hoạt động, nhưng nó có vẻ sai. Phông chữ của các yếu tố ưu tiên quá lớn (được thử nghiệm trên Android 4.1 và 5.1).

@ mus65 Đó là vấn đề. Tôi đã đoán mình nên sử dụng chủ đề đó nhưng nó có vẻ tệ. Tôi đã thêm nhiều chi tiết hơn vào câu hỏi ban đầu.
Phức tạp

3
Tôi đã chọn đây là câu trả lời đúng vì đây là câu đầu tiên cho biết chủ đề chính xác cần đặt. Tuy nhiên, thư viện hỗ trợ cần được sửa để các tùy chọn sử dụng material design theo code.google.com/p/android/issues/detail?id=183376
Intrications

Làm cách nào để làm cho chủ đề trông giống material-design? Hiện nay nó cho thấy cái nhìn tự nhiên đối với tôi ...
android phát triển

1
Đọc câu trả lời của tôi dưới đây.
Gergely Kőrössy

35

Có vẻ như Google đã khắc phục sự cố này. Tôi đã thử nghiệm điều này với phiên bản v14-support 25.3.1 tùy chọn

1) Thêm implementation 'com.android.support:preference-v14:25.3.1'vào Gradle của bạn.

2) Thêm PreferenceThemeOverlay.v14.Materialvào kiểu thay vì PreferenceThemeOverlay.

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

3) Cuối cùng, thêm kiểu vào Tệp kê khai

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

Vấn đề duy nhất với câu trả lời này là phân đoạn tùy chọn sẽ sử dụng chủ đề material trên các hệ thống chạy KitKat trở xuống. Thiết preferenceThemeđể PreferenceThemeOverlay.v14styles.xmlvà để PreferenceThemeOverlay.v14.Materialtrong styles-v21.xmlsửa chữa vấn đề.
Jack Meister

@JackMeister, bạn chỉ nên sử dụng phiên bản v14 nếu bạn nhắm mục tiêu api cấp 14 trở lên. Chủ đề không tương thích với các phiên bản cũ hơn có thể không phải là vấn đề duy nhất của bạn khi bạn sử dụng v14 với các cấp api cũ hơn.
Jelmer Brands

@JelmerBrands Chắc chắn, bạn không nên sử dụng một thư viện hỗ trợ v14 trên các hệ thống chạy các cấp API bên dưới nhận xét 14. My giả định một minSdkVersiongiữa 14 và 20.
Jack Meister

Đã thử nghiệm với 23.4.0, hoạt động tốt. Sử dụng tùy chọn v14, không phải v7, là chìa khóa.
dùng149408

14

Để sử dụng PreferenceFragmentCompat, bạn phải đặt preferenceThemetrong chủ đề của mình:

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

Bằng cách này, bạn có thể tùy chỉnh preferenceThemekiểu bố cục được sử dụng cho từng loại tùy chọn mà không ảnh hưởng đến các phần khác trong Hoạt động của bạn.


Đảm bảo rằng bạn đang thêm tùy chọn Chủ đề vào đúng phong cách được đặt làm chủ đề cho hoạt động của bạn stackoverflow.com/a/40736138/1572286
Youness

14

Tôi vừa thêm dòng này vào chủ đề và nó hoạt động hoàn hảo trên API 19 trở lên.

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

3
Đây là giải pháp đơn giản nhất, hoạt động mà không cần thêm phụ thuộc. Phải là câu trả lời được chấp nhận IMHO, hiện tại hầu hết các ứng dụng đều có API tối thiểu 14+
Louis CAD

Android studio không thể tìm thấy điều này
Denny

3
thêm com.android.support:preference-v14: to build.gradle
Sofi Software LLC

3

Giải pháp phù hợp với tôi trong API 25. Tôi có chủ đề mặc định này:

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

Và thêm dòng này vào nó

<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 đã được xác định, tôi không cần phải đưa nó vào. Nó hoạt động trên các thiết bị Android 4.x và 5.x của riêng tôi


2

Thêm mã này vào styles.xml của bạn và sửa đổi nó theo. Nó sẽ hoạt động tốt.

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

Tôi đã thêm mục "tùy chọn Chủ đề" vào phong cách của mình và điều đó dường như đã khắc phục được sự cố:

   <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

Trang web hữu ích nhất cho tôi: Trung bình

Tác giả cho thấy rằng chúng ta cần thêm hai gói: com.android.support:preference-v7com.android.support:preference-v14, bởi vì gói đầu tiên nó được phân phối không có kiểu.

Cho tôi biết nếu nó hoạt động


0

"Takisoft Fix" được chấp nhận có vẻ khá khó hiểu và sau khi thử nghiệm với nó, tôi vẫn không hài lòng với giao diện kết quả.

Nếu bạn cần PreferenceFragmentthư viện hỗ trợ API 9+ , tôi khuyên bạn nên sử dụng Thư viện hỗ trợ tùy chọn vật liệu . Nó hoạt động hoàn hảo (ít nhất là đối với tôi).


0

Sự cố xảy ra do AAPT (Công cụ đóng gói tài sản Android) không thể tìm thấy một số tài nguyên. Khắc phục sự cố này như sau:

1. Sao chép tài nguyên cần thiết vào một thư mục tài nguyên phản hồi mới, có tên như res_fw_v7_preference hoặc một cái gì đó khác.

2. Sử dụng gradle để xây dựng ứng dụng của bạn và thêm một số tùy chọn AAPT bổ sung trong build.gradle (của mô-đun) như sau:

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

Hy vọng điều này là hữu ích :)


0

Cảm ơn @sergio đã trả lời, việc sử dụng <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>thay vì <item name="preferenceTheme">@style/Preference</item>phù hợp với tôi.

<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

Chỉ cần để nó đi và sử dụng API 11+.

API 7 hiện đã gần bảy năm tuổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.