CapsFragmentCompat को सेट करने के लिए वरीयताएँ की आवश्यकता होती है


114

V7 प्राथमिकता सहायता लाइब्रेरी से नई प्राथमिकता फेगमेंटकम्पैट के साथ: 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>

जैसा कि @Bato द्वारा सुझाया गया है, लेकिन यह सही नहीं लगता है और लॉलीपॉप पर भी बहुत होलो दिखता है।

समर्थन पुस्तकालय:

यहां छवि विवरण दर्ज करें

मूल प्राथमिकताएं:

यहां छवि विवरण दर्ज करें


2
इसके लिए दस्तावेज़ के बारे में एक बग है: code.google.com/p/android/issues/…
'21

1
व्यक्तिगत रूप से मुझे नहीं लगता कि ये समाधान वर्कअराउंड के लायक हैं। प्रयास करें github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
क्या आप स्वीकृत उत्तर के रूप में stackoverflow.com/a/44236460/238753 को चिह्नित कर सकते हैं ?
सैम

जवाबों:


159

नमूना परियोजना यहां पाई जा सकती है

बगफिक्स एक डिपेंडल डिपेंडेंसी के रूप में उपलब्ध है

डाउनलोड

अब एक पुस्तकालय का उपयोग बहुत आसान कर सकते हैं। यहां ऐसा करने का सबसे तेज़ तरीका है, लेकिन आपको अधिक जानकारी के लिए README की जांच करनी चाहिए।

1. अपने मॉड्यूल की फ़ाइल को अद्यतन करें:

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

2. अपने खंड के आधार के रूप में उपयुक्त वर्ग का उपयोग करें

आप PreferenceFragmentCompatया तो उपयोग कर सकते हैं या PreferenceFragmentCompatDividers

( आयात करते समय उपयुक्त पैकेज नाम के लिए देखें PreferenceFragmentCompat! )

3. उपयुक्त विषय का उपयोग करें

@style/PreferenceFixThemeNoActionBar, Light, इत्यादि के साथ अपनी गतिविधि के विषय को एक संस्करण में सेट करें

अधिक जानकारी और उपयोग युक्तियों के लिए, परियोजना के पृष्ठ पर जाएं


PS इस खंड में आप विस्तृत समाधान पा सकते हैं जिससे पुस्तकालय का निर्माण हुआ, लेकिन मैंने इसे हटाने का फैसला किया क्योंकि यह भ्रामक हो सकता है। यदि आप चरणों के बारे में उत्सुक हैं, तो आप अभी भी उन्हें इस उत्तर के संशोधन इतिहास में पा सकते हैं ।


6
डिफ़ॉल्ट पाठ का आकार बहुत बड़ा है, मैंने इसे उन शैलियों का उपयोग करके संशोधित करने का प्रयास किया जिन्हें आपने सफलता के बिना इंगित किया था। क्या आपने शायद पाठ आकार को समायोजित करने का प्रबंधन किया था?
तिनशे

4
मैं सामग्री डिजाइन को वहां डालने की कोशिश कर रहा हूं, लेकिन वास्तव में सफल नहीं हूं ... इस प्रक्रिया के दौरान मुझे जो पता चला है वह यह है कि v7 वरीयता पैक पूरी तरह से सामग्री थीम्ड शैली, लेआउट और अन्य फाइलों को याद कर रहा है। इस बीच, v14 में उनमें से कुछ शामिल हैं, लेकिन v14 के साथ समस्या यह है कि यह देशी Fragment का विस्तार करता है, समर्थन का नहीं। मुझे लगता है कि Google ने यहां एक बहुत बड़ी गलती की है, उम्मीद है कि वे इसे ठीक कर
देंगे

1
मैं पहले से ही 21 उपकरणों के लिए सामग्री के डिजाइन को रखने की कोशिश कर सकता हूं, वे अब मूल के समान दिखते हैं।
गेर्गेले Kőrössy

2
आपको यह भी उल्लेख करना चाहिए कि अगर ओपन डायलॉग के साथ घुमाया जाए, तोगेफ्रैगमेंटकम्पैट क्रैश हो जाता है। code.google.com/p/android/issues/detail?id=186160
headsvk

21
यह मज़ाकीय है। सभी संस्करणों पर इस कार्य को 100% करने के लिए आवश्यक सभी बग, वर्कअराउंड और परीक्षण के माध्यम से एक रास्ता खोजने की तुलना में मुझे खरोंच से वरीयता टुकड़ा बनाने में कम समय लगेगा।
एडवर्ड वैन राक

46

आपको अपनी प्राथमिकता गतिविधि के विषय में प्रायोरिटी को निर्दिष्ट करना होगा।

उदाहरण के लिए :

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

वरीयता थीम ओवरलेयर डिफ़ॉल्ट थीम है जो वरीयता-वी 7 समर्थन पुस्तकालय के साथ आता है।


14
यह काम करता है, लेकिन यह गलत लगता है। वरीयता तत्वों के फ़ॉन्ट बहुत बड़े हैं (Android 4.1 और 5.1 पर परीक्षण किए गए)।

@ mus65 यही समस्या है। मैंने अनुमान लगाया था कि मुझे उस विषय का उपयोग करना चाहिए लेकिन यह बुरा लग रहा है। मैंने मूल प्रश्न में और विवरण जोड़ दिए हैं।
Intrications

3
मैंने इसे सही उत्तर के रूप में चुना है क्योंकि यह पहला था जिसने सेट करने के लिए सही विषय कहा था। हालांकि समर्थन पुस्तकालय कि प्राथमिकताओं के अनुसार सामग्री डिजाइन उपयोग करती हैं इसलिए ठीक करने की आवश्यकता है code.google.com/p/android/issues/detail?id=183376
Intrications

मैं विषय-वस्तु को डिज़ाइन-डिज़ाइन कैसे बनाऊँ? वर्तमान में यह मेरे लिए देशी लुक दिखाता है ...
एंड्रॉइड डेवलपर

1
नीचे मेरा जवाब पढ़ें।
गेर्गेले Kőrössy

35

लगता है कि Google ने इस समस्या को ठीक कर दिया है। मैंने इसे प्राथमिकता v14- समर्थन संस्करण 25.3.1 के साथ परीक्षण किया है

1) implementation 'com.android.support:preference-v14:25.3.1'अपने ग्रेड में जोड़ें ।

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"

इस उत्तर के साथ एकमात्र समस्या यह है कि वरीयता टुकड़ा किटकैट और नीचे चल रहे सिस्टम पर सामग्री विषय का उपयोग करेगा। समस्या को हल preferenceThemeकरने PreferenceThemeOverlay.v14में styles.xmlऔर उसमें सेटिंग करना । PreferenceThemeOverlay.v14.Materialstyles-v21.xml
जैक मिस्टर

@JackMeister आपको केवल v14 संस्करण का उपयोग करना चाहिए यदि आप एपीआई स्तर 14 या उच्चतर को लक्षित करते हैं। जब आप पुराने एपीआई स्तरों के साथ v14 का उपयोग करते हैं तो पुराने संस्करणों के साथ थीम असंगति आपकी एकमात्र समस्या नहीं हो सकती है।
जेलर ब्रांड्स

@JelmerBrands ज़रूर: आप नीचे एपीआई स्तर पर चल रहे सिस्टम पर एक v14 समर्थन पुस्तकालय का उपयोग नहीं करना चाहिए। मेरी टिप्पणी minSdkVersion14 और 20 के बीच होती है।
जैक मीस्टर

23.4.0 के साथ परीक्षण किया गया, जो अभी भी काम करता है। V14- वरीयता का उपयोग करना, v7- वरीयता नहीं, कुंजी है।
user149408

14

आपके द्वारा अपने विषय में सेट की जाने वाली पसंदफ्रेगमेंट.कॉम का उपयोग करने के लिए preferenceTheme:

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

इस तरह आप preferenceThemeअपनी गतिविधि के अन्य भागों को प्रभावित किए बिना प्रत्येक वरीयता प्रकार के लिए उपयोग किए जाने वाले लेआउट को स्टाइल करने के लिए अनुकूलित कर सकते हैं ।


सुनिश्चित करें कि आप सही शैली को पसंद कर रहे हैं, जो आपकी गतिविधि के लिए थीम के रूप में सेट की गई है stackoverflow.com/a/40736138/1572286
युनुस

14

मैंने अभी इस लाइन को थीम में जोड़ा है और यह एपीआई 19 और उससे अधिक पर काम कर रही है।

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

3
यह सबसे सरल, काम करने वाला समाधान है, इसके लिए किसी अतिरिक्त निर्भरता की आवश्यकता नहीं है। IMHO का स्वीकार किया हुआ उत्तर होना चाहिए, अब जब कि ज्यादातर ऐप्स मिनट एपीआई 14+
लुई सीएडी

Android स्टूडियो इसे नहीं खोज सकता
डेनी

3
add.android.support:preference-v14: to build.gradle
सोफी सॉफ्टवेयर एलएलसी

3

समाधान जो मेरे लिए एपीआई 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>

CapsThemeOverlay पहले से ही परिभाषित था, मुझे इसे शामिल नहीं करना था। यह एंड्रॉइड 4.x और मेरे खुद के 5.x उपकरणों पर काम करता था


2

अपनी शैली में इस कोड को जोड़ें। 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

स्वीकृत "टैकसॉफ्ट फ़िक्स" बल्कि कुंद लगता है और इसके साथ खेलने के बाद, मैं अभी भी परिणामी नज़र से संतुष्ट नहीं हूं।

यदि आपको API 9+ PreferenceFragmentसमर्थन लाइब्रेरी की आवश्यकता है , तो मैं सामग्री वरीयता सहायता लाइब्रेरी का उपयोग करने की सलाह देता हूं । यह पूरी तरह से काम करता है (कम से कम मेरे लिए)।


0

समस्या तब होती है क्योंकि AAPT (Android Asset पैकेजिंग टूल) कुछ संसाधन नहीं ढूँढ सकता है। इस समस्या को निम्नानुसार ठीक करें:

1.कॉपी संसाधन जो एक नए प्रतिसाद संसाधन फ़ोल्डर के लिए आवश्यक हैं, जिसे res_fw_v7_preference या कुछ और नाम दिया गया है।

2. अपने अनुप्रयोग का निर्माण करने के लिए ढाल का उपयोग करना और बिल्ड में कुछ अतिरिक्त 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

बस इसे जाने दें और एपीआई 11+ का उपयोग करें।

एपीआई 7 अब लगभग सात साल पुराना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.