PreferenceFragmentCompat ต้องการการตั้งค่า PreferenceTheme


114

ด้วย PreferenceFragmentCompat ใหม่จาก v7 Preference Support Library: 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

ห้องสมุดสนับสนุน:

ใส่คำอธิบายภาพที่นี่

ค่ากำหนดดั้งเดิม:

ใส่คำอธิบายภาพที่นี่


2
มีข้อบกพร่องเกี่ยวกับเอกสารนี้: code.google.com/p/android/issues/…
Intrications

1
โดยส่วนตัวแล้วฉันไม่คิดว่าโซลูชันเหล่านี้คุ้มค่ากับการแก้ปัญหา ลองใช้github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
คุณช่วยทำเครื่องหมายstackoverflow.com/a/44236460/238753เป็นคำตอบที่ยอมรับได้ไหม
แซม

คำตอบ:


159

โครงการตัวอย่างสามารถพบได้ที่นี่

การแก้ไขข้อบกพร่องพร้อมใช้งานในรูปแบบการพึ่งพาผู้เรียน

ดาวน์โหลด

ตอนนี้เราสามารถใช้ห้องสมุดได้อย่างง่ายดาย ต่อไปนี้เป็นวิธีที่เร็วที่สุด แต่คุณควรตรวจสอบ README สำหรับข้อมูลเพิ่มเติม

1. อัปเดตไฟล์ gradle ของโมดูลของคุณ:

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

2. ใช้คลาสที่เหมาะสมเป็นฐานของส่วนของคุณ

คุณสามารถใช้อย่างใดอย่างหนึ่งPreferenceFragmentCompatหรือPreferenceFragmentCompatDividers.

( ระวังชื่อแพ็คเกจที่เหมาะสมเมื่อนำเข้าPreferenceFragmentCompat! )

3. ใช้ธีมที่เหมาะสม

ตั้งค่าธีมของกิจกรรมที่มีอยู่ของคุณเป็นตัวแปร@style/PreferenceFixThemeเช่น NoActionBar, Light เป็นต้น

สำหรับข้อมูลและการใช้งานมากขึ้นเคล็ดลับไปที่หน้าของโครงการ


ป.ล. ในส่วนนี้คุณจะพบวิธีแก้ปัญหาโดยละเอียดที่นำไปสู่การสร้างไลบรารี แต่ฉันตัดสินใจที่จะลบออกเพราะอาจทำให้สับสนได้ หากคุณสงสัยเกี่ยวกับขั้นตอนต่างๆคุณยังสามารถค้นหาได้ในประวัติการแก้ไขของคำตอบนี้


6
ขนาดข้อความเริ่มต้นใหญ่เกินไปฉันลองแก้ไขโดยใช้สไตล์เหล่านี้ที่คุณชี้ให้เห็นแล้วไม่ประสบความสำเร็จ บางทีคุณสามารถปรับขนาดตัวอักษรได้หรือไม่?
Tinashe

4
ฉันพยายามใส่ดีไซน์ Material ลงไป แต่ไม่ประสบความสำเร็จจริงๆ ... สิ่งที่ฉันค้นพบระหว่างกระบวนการนี้คือ v7 ค่ากำหนดแพ็คขาดสไตล์การจัดวางและไฟล์อื่น ๆ ที่เป็นธีมวัสดุ ในขณะเดียวกัน v14 มีบางส่วน แต่ปัญหาของ v14 คือมันขยาย Fragment ดั้งเดิมไม่ใช่ส่วนรองรับ ฉันคิดว่า Google เพิ่งทำผิดพลาดครั้งใหญ่ที่นี่หวังว่าพวกเขาจะแก้ไขได้โดยเร็ว ...
Gergely Kőrössy

1
ฉันอาจจะลองวางดีไซน์ Material สำหรับอุปกรณ์ยุคก่อน 21 ด้วยซึ่งมันก็ดูเหมือนของเดิมในตอนนี้
Gergely Kőrössy

2
คุณควรระบุด้วยว่า PreferenceFragmentCompat ล้มเหลวหากหมุนด้วยกล่องโต้ตอบที่เปิดอยู่ code.google.com/p/android/issues/detail?id=186160
Headsvk

21
นี่มันไร้สาระ ฉันจะใช้เวลาน้อยลงในการสร้างส่วนกำหนดลักษณะตั้งแต่เริ่มต้นแทนที่จะหาทางผ่านจุดบกพร่องวิธีแก้ปัญหาและการทดสอบทั้งหมดที่จำเป็นเพื่อให้สิ่งนี้ทำงานได้ 100% ในทุกเวอร์ชัน
Edward van Raak

46

คุณต้องระบุการตั้งค่าธีมในธีมกิจกรรมการตั้งค่าของคุณ

ตัวอย่างเช่น :

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

PreferenceThemeOverlay เป็นธีมเริ่มต้นที่มาพร้อมกับไลบรารีการสนับสนุนการกำหนดค่าตามความชอบ v7


14
นี่ใช้งานได้ แต่มันดูผิด แบบอักษรขององค์ประกอบการกำหนดลักษณะใหญ่เกินไป (ทดสอบบน Android 4.1 และ 5.1)

@ mus65 นั่นคือปัญหา ฉันเดาว่าน่าจะใช้ธีมนั้น แต่มันดูไม่ดี ฉันได้เพิ่มรายละเอียดให้กับคำถามเดิมแล้ว
Intrications

3
ฉันได้เลือกคำตอบนี้เป็นคำตอบที่ถูกต้องเนื่องจากเป็นคำตอบแรกที่ระบุว่าควรตั้งธีมที่ถูกต้อง อย่างไรก็ตามจำเป็นต้องแก้ไขไลบรารีสนับสนุนเพื่อให้การตั้งค่าใช้การออกแบบวัสดุตามcode.google.com/p/android/issues/detail?id=183376
Intrications

ฉันจะทำให้ชุดรูปแบบดูมีดีไซน์ Material ได้อย่างไร? ขณะนี้มันแสดงให้เห็นถึงรูปลักษณ์ดั้งเดิมสำหรับฉัน ...
นักพัฒนา Android

1
อ่านคำตอบของฉันด้านล่าง
Gergely Kőrössy

35

ดูเหมือนว่า Google ได้แก้ไขปัญหานี้แล้ว ฉันได้ทดสอบสิ่งนี้ด้วยความชอบ v14-support เวอร์ชัน 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 และต่ำกว่า การตั้งค่าpreferenceThemeไปPreferenceThemeOverlay.v14ในstyles.xmlและPreferenceThemeOverlay.v14.Materialในstyles-v21.xmlการแก้ไขปัญหาที่เกิดขึ้น
Jack Meister

@JackMeister คุณควรใช้เวอร์ชัน v14 หากคุณกำหนดเป้าหมาย api ระดับ 14 ขึ้นไปเท่านั้น ความเข้ากันไม่ได้ของธีมกับเวอร์ชันเก่าอาจไม่ใช่ปัญหาเดียวของคุณเมื่อคุณใช้ v14 กับระดับ API ที่เก่ากว่า
Jelmer Brands

@JelmerBrands Sure: คุณไม่ควรใช้ไลบรารีสนับสนุน v14 ในระบบที่ใช้ API ระดับต่ำกว่า 14 ความคิดเห็นของฉันถือว่าminSdkVersionอยู่ระหว่าง 14 ถึง 20
Jack Meister

ทดสอบด้วย 23.4.0 ซึ่งใช้งานได้ดีเช่นกัน การใช้ค่ากำหนด v14 ไม่ใช่ค่ากำหนด v7 เป็นกุญแจสำคัญ
user149408

14

ในการใช้PreferenceFragmentCompatคุณต้องตั้งค่าpreferenceThemeในธีมของคุณ:

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

ด้วยวิธีนี้คุณสามารถปรับแต่งpreferenceThemeเพื่อกำหนดสไตล์เลย์เอาต์ที่ใช้สำหรับประเภทความชอบแต่ละประเภทโดยไม่ส่งผลกระทบต่อส่วนอื่น ๆ ของกิจกรรมของคุณ


ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มค่ากำหนดธีมเป็นสไตล์ที่ถูกต้องซึ่งกำหนดเป็นธีมสำหรับกิจกรรมของคุณstackoverflow.com/a/40736138/1572286
Youness

14

ฉันเพิ่งเพิ่มบรรทัดนี้ในธีมและมันทำงานได้อย่างสมบูรณ์แบบบน API 19 ขึ้นไป

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

3
นี่เป็นวิธีแก้ปัญหาที่ใช้งานง่ายที่สุดโดยไม่ต้องพึ่งพาเพิ่มเติม ควรเป็นคำตอบที่ได้รับการยอมรับ IMHO ตอนนี้แอปส่วนใหญ่เป็น API ขั้นต่ำ 14+
Louis CAD

Android studio ไม่พบสิ่งนี้
Denny

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

ฉันเพิ่มรายการ "การตั้งค่าธีม" ลงในสไตล์ของฉันและดูเหมือนจะช่วยแก้ปัญหาได้:

   <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

ไซต์ที่เป็นประโยชน์ที่สุดสำหรับฉัน: ปานกลาง

ผู้เขียนแสดงให้เห็นว่าเราจำเป็นต้องเพิ่มสองแพ็คเกจ: com.android.support:preference-v7และcom.android.support:preference-v14เนื่องจากแพ็คเกจแรกถูกแจกจ่ายโดยไม่มีสไตล์

แจ้งให้เราทราบหากได้ผล


0

"Takisoft Fix" ที่ได้รับการยอมรับนั้นดูเหมือนจะค่อนข้างแย่และหลังจากเล่นกับมันแล้วฉันก็ยังไม่พอใจกับรูปลักษณ์ที่ได้

หากคุณต้องการ API 9+ PreferenceFragmentห้องสมุดสนับสนุนผมขอแนะนำให้ใช้ห้องสมุดสนับสนุนการตั้งค่าวัสดุ มันทำงานได้อย่างสมบูรณ์ (อย่างน้อยสำหรับฉัน)


0

ปัญหาเกิดขึ้นเนื่องจาก AAPT (Android Asset Packaging Tool) ไม่พบทรัพยากรบางอย่าง แก้ไขปัญหานี้ดังนี้:

1. คัดลอกทรัพยากรที่จำเป็นสำหรับโฟลเดอร์รีซอร์สการตอบสนองใหม่ชื่อ res_fw_v7_preference หรืออย่างอื่น

2. ใช้ gradle เพื่อสร้างแอปพลิเคชันของคุณและเพิ่มตัวเลือก AAPT เพิ่มเติมใน build.gradle (โมดูล) ดังนี้:

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.