PreferenceFragmentCompatでは、preferenceThemeを設定する必要があります


114

v7設定サポートライブラリの新しいPreferenceFragmentCompat:http : //developer.android.com/tools/support-library/features.html#v7-preferenceで、このエラーが発生します

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

どのようなテーマを設定する必要がありますか?

更新:私は使ってみました

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

@Bogatoで提案されているように、Lollipopでも正しく見えず、非常にHoloに見えます。

サポートライブラリ:

ここに画像の説明を入力してください

ネイティブの設定:

ここに画像の説明を入力してください


2
これに関するドキュメントにはバグがあります:code.google.com/p/android/issues/…–
複雑化

1
個人的に私はこれらの解決策が回避策の価値があるとは思いません。github.com/kolavar/android-support-v4-preferencefragmentをお
MidasLefko

1
stackoverflow.com/a/44236460/238753を承認済みの回答としてマークできますか?
Sam

回答:


159

サンプルプロジェクトはここにあります

バグ修正はgradleの依存関係として利用可能です

ダウンロード

これで、ライブラリを非常に簡単に使用できます。これが最も簡単な方法ですが、詳細についてはREADMEを確認してください。

1.モジュールのgradleファイルを更新します:

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

2.適切なクラスをフラグメントのベースとして使用します

PreferenceFragmentCompatまたはを使用できますPreferenceFragmentCompatDividers

インポート時に適切なパッケージ名に注意してPreferenceFragmentCompatください!

3.適切なテーマを使用する

含まれているアクティビティのテーマを@style/PreferenceFixThemeNoActionBar、Lightなどのバリアントに設定します。

詳細と使用のヒントについては、プロジェクトのページにアクセスしてください


PSこのセクションでは、ライブラリの作成につながった詳細な解決策を見つけることができますが、混乱を招く可能性があるため、削除することにしました。手順に興味がある場合でも、この回答の改訂履歴でそれらを見つけることができます。


6
デフォルトのテキストサイズが大きすぎるため、指摘されたこれらのスタイルを使用して変更しようとしましたが、成功しませんでした。おそらくテキストサイズを調整できましたか?
Tinashe

4
マテリアルデザインをそこに配置しようとしていますが、実際にはうまくいきません...プロセス中に発見したのは、v7プリファレンスパックにマテリアルテーマのスタイル、レイアウト、その他のファイルが完全に欠落していることです。一方、v14にはそれらの一部が含まれていますが、v14の問題は、サポートではなくネイティブフラグメントを拡張することです。Googleはここで本当に大きな間違いを犯したと思います。うまくいけば、彼らはそれをできるだけ早く修正します...
GergelyKőrössy'20

1
21年以前のデバイスにもマテリアルデザインを導入しようと思うかもしれませんが、現在は元のデバイスと同じように見えます。
GergelyKőrössy15年

2
また、開いているダイアログで回転すると、PreferenceFragmentCompatがクラッシュすることにも言及する必要があります。code.google.com/p/android/issues/detail?id=186160
headsvk

21
ばかげてる。すべてのバージョンでこの作業を100%にするために必要なすべてのバグ、回避策、テストを実行する方法を見つけるよりも、最初から設定フラグメントを作成する方が時間がかかりません。
Edward van Raak 16

46

あなたの好みの活動のテーマでpreferenceThemeを指定する必要があります。

例えば ​​:

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

PreferenceThemeOverlayは、preference-v7サポートライブラリに付属するデフォルトのテーマです。


14
これは機能しますが、正しくありません。設定要素のフォントが大きすぎます(Android 4.1および5.1でテスト済み)。

@ mus65それが問題です。そのテーマを使うべきだと思っていましたが、見た目が悪いです。元の質問に詳細を追加しました。
複雑化

3
これは、正しいテーマを設定する最初の質問だったので、これを正しい答えとして選択しました。しかし、サポートライブラリは、好みに応じては、材料設計を使用するように固定する必要がないcode.google.com/p/android/issues/detail?id=183376
Intrications

テーマをマテリアルデザインにするにはどうすればよいですか?現在、それは私のためのネイティブな外観を示しています...
Android開発者

1
以下の私の答えを読んでください。
GergelyKőrössy15年

35

Googleがこの問題を修正したようです。これを設定v14-サポートバージョン25.3.1でテストしました

1)implementation 'com.android.support:preference-v14:25.3.1'Gradleに追加します。

2)のPreferenceThemeOverlay.v14.Material代わりにスタイルに追加しPreferenceThemeOverlayます。

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

3)最後に、マニフェストにスタイルを追加します

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

この回答の唯一の問題は、設定フラグメントがKitKat以下を実行しているシステムでマテリアルテーマを使用することです。in およびto に設定preferenceThemeすると、問題が修正されます。PreferenceThemeOverlay.v14styles.xmlPreferenceThemeOverlay.v14.Materialstyles-v21.xml
ジャックマイスター

@JackMeisterは、APIレベル14以上をターゲットにする場合にのみ、v14バージョンを使用する必要があります。古いAPIレベルでv14を使用する場合、古いバージョンとのテーマの非互換性が唯一の問題ではない可能性があります。
Jelmer Brands

@JelmerBrandsは確かに:あなたは14私のコメントの下にAPIレベルを実行しているシステムでV14サポートライブラリを使用してはならないと仮定しminSdkVersion14と20との間を
ジャック・マイスター

同様に動作する23.4.0でテストされています。重要なのは、v7-preferenceではなく、v14-preferenceを使用することです。
user149408

14

PreferenceFragmentCompatを使用するにpreferenceThemeは、テーマで設定する必要があります。

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

このようpreferenceThemeにして、アクティビティの他の部分に影響を与えずに、各設定タイプに使用されるレイアウトをスタイルするようにをカスタマイズできます。


あなたがあなたの活動のテーマとして設定されている右のスタイルにpreferenceThemeを追加されていることを確認しstackoverflow.com/a/40736138/1572286
Youness

14

この行をテーマに追加したところ、API 19以上で完璧に動作しました。

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

3
これは、追加の依存関係を必要としない、最も単純で実用的なソリューションです。ほとんどのアプリは最小API 14+であるため、IMHOは受け入れられた回答である必要があります
Louis CAD

Androidスタジオはこれを見つけることができません
デニー

3
com.android.support:preference-v14:to build.gradleを追加
Sofi Software LLC

3

API 25で私のために働いたソリューション。私はこのデフォルトのテーマを持っていました:

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

そして、この行をそれに追加しました

<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は既に定義されているので、含める必要はありませんでした。私自身のAndroid 4.xおよび5.xデバイスで動作しました


2

このコードをstyles.xmlに追加し、必要に応じて変更します。正常に動作するはずです。

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

"preferenceTheme"アイテムをスタイルに追加したところ、問題が解決したようです。

   <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

私にとって最も役立つサイト:

著者は、2つのパッケージを追加する必要があることを示しています:com.android.support:preference-v7com.android.support:preference-v14、これは最初のパッケージがスタイルなしで配布されているためです。

機能するかどうか教えてください


0

受け入れられた "Takisoft Fix"はかなりぎこちないようで、それをいじった後でも、結果の外観に満足できません。

API 9+ PreferenceFragmentサポートライブラリが必要な場合は、Material Preference Support Libraryを使用することをお勧めします。 それは完全に動作します(少なくとも私にとっては)。


0

この問題は、AAPT(Android Asset Packaging Tool)が一部のリソースを見つけられないために発生します。この問題を次のように修正します。

1.必要なリソースを、res_fw_v7_preferenceなどの名前が付いた新しい応答リソースフォルダーにコピーします。

2. gradleを使用してアプリケーションをビルドし、次のようにbuild.gradle(module's)に追加のAAPTオプションを追加します。

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

これが役に立てば幸い:)


0

おかげで使用して、答えを@sergio <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>するのではなく、 <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

手放すだけでAPI 11+を使用できます。

API 7は、ほぼ7年前のものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.