क्या प्राथमिकता पैकेज से जानबूझकर प्राथमिकता से बाहर रखा गया था?


153

मैं उन वरीयताओं को लिखना चाहता हूं जो 3.0 और प्री-3.0 दोनों उपकरणों पर लागू हो सकते हैं। यह पता चलता है कि PreferenceActivityइसमें पदावनत विधियाँ शामिल हैं (हालाँकि इनका उपयोग नमूना कोड के साथ किया जाता है), मैंने PreferenceFragementअपने संकटों को हल करने के लिए संगतता पैकेज को देखा ।

यह प्रतीत होता है, हालांकि, यह PreferenceFragmentसंगतता पैकेज में नहीं है। क्या कोई मुझे बता सकता है कि क्या यह जानबूझकर था? यदि हां, तो क्या मैं आसानी से उपकरणों की एक श्रृंखला को लक्षित कर सकता हूं (यानी <3.0 और> = 3.0) या मुझे हुप्स से कूदना होगा? यदि इसे जानबूझकर बाहर नहीं किया गया था, तो क्या हम संगतता पैकेज की एक नई रिलीज की उम्मीद कर सकते हैं? या क्या कोई अन्य समाधान है जो उपयोग करने के लिए सुरक्षित है?

चियर्स

जेम्स


1
यह समस्या को हल करने के लिए मेरा दृष्टिकोण है: stackoverflow.com/questions/14076073/…
ecv

किसी ने तीसरी पार्टी बनाई PreferenceFragmentजिसे आप भूल जाएंगे यहां तक ​​कि है। मेरा जवाब देखिए ।
दिबांग

क्रिस बेंस ने अपने ब्लॉग पर एक टिप्पणी में यह बात कही । उन्होंने कहा कि कारण है,"Because most of Preferences' implementation is hidden, therefore impossible to backport without lots of hackery."
theblang

देखिये मेरा अपडेटेड जवाबPreferenceFragmentCompatहाल ही में समर्थन पुस्तकालय में जोड़ा गया था।
दिबांग

जवाबों:


90

यह पता चलता है कि वरीयता-युक्तता में पदावनत विधियाँ शामिल हैं (हालाँकि इनका उपयोग नमूना कोड में किया जाता है)

पदावनत विधियों को Android 3.0 के रूप में चित्रित किया गया है। वे एंड्रॉइड के सभी संस्करणों पर पूरी तरह से ठीक हैं, लेकिन दिशा PreferenceFragmentएंड्रॉइड 3.0 और उच्चतर पर उपयोग करना है।

क्या कोई मुझे बता सकता है कि क्या यह जानबूझकर था?

मेरा अनुमान है कि यह इंजीनियरिंग के समय का सवाल है, लेकिन यह सिर्फ एक अनुमान है।

यदि हां, तो क्या मैं आसानी से उपकरणों की एक श्रृंखला को लक्षित कर सकता हूं (अर्थात <3.0 और> = 3.0) या मुझे हुप्स से कूदना होगा?

मैं इसे "आसानी से" करने के लिए मानता हूं। दो अलग-अलग PreferenceActivityकार्यान्वयन हैं, एक प्राथमिकता हेडर PreferenceFragmentsका उपयोग कर और दूसरा मूल दृष्टिकोण का उपयोग करके। उस बिंदु पर सही चुनें जिसे आपको ज़रूरत है (उदाहरण के लिए, जब उपयोगकर्ता विकल्प मेनू आइटम पर क्लिक करता है)। यहां एक नमूना परियोजना प्रदर्शित की गई है। या, एक एकल है PreferenceActivityजो दोनों मामलों को संभालता है, जैसा कि इस नमूना परियोजना में है

यदि इसे जानबूझकर बाहर नहीं किया गया था, तो क्या हम संगतता पैकेज की एक नई रिलीज की उम्मीद कर सकते हैं?

आपको पता चल जाएगा कि कब हम में से बाकी लोगों को पता चल गया, जो कहना है, अगर यह जहाज है।

या क्या कोई अन्य समाधान है जो उपयोग करने के लिए सुरक्षित है?

ऊपर देखो।


चीयर्स मार्क। मैंने देखा कि आप इस बारे में कुछ स्थानों (एंड्रॉइड गूगल ग्रुप और अपने ब्लॉग) पर टिप्पणी कर चुके हैं, लेकिन एक निश्चित जवाब चाहते थे (जहां तक ​​कि परिस्थितियों को दिया जा सकता है)।
जेम्स

@ नाम: हाँ, रगड़ प्राथमिकता एक्सएमएल परिभाषा में होगी, कुछ ऐसा हो रहा है जो टुकड़ों के रूप में अच्छी तरह से काम करेगा और साथ में संक्षिप्त भी होगा, क्योंकि मुझे यकीन नहीं है कि <include>वरीयता एक्सएमएल के साथ काम करती है। BTW, यदि आप एक ग्राहक हैं, तो इस परियोजना को संदर्भित पुस्तक अद्यतन मिनटों पहले घोषित किया गया था।
कॉमंसवेयर

7
मुझे क्षमा करें, लेकिन मैं वास्तव में निश्चित नहीं हूं कि आप यहां क्या करने की कोशिश कर रहे हैं। आप कुछ भी जवाब नहीं देते हैं, केवल टिप्पणी / अनुमान / अप्रासंगिक बाहरी लिंक का संदर्भ देते हैं जिनका समस्या से कोई लेना-देना नहीं है। सवाल यह है कि चूक जानबूझकर की गई थी या नहीं, वरीयता संस्करण के संगतता संस्करण के बिना , आपके द्वारा बताए गए तरीके से वरीयता का विस्तार करने का कोई साधन नहीं है क्योंकि यदि प्राथमिकता नहीं है, तो न तो प्राप्त करें और न ही किसी अन्य तरीके से। पहली जगह में टुकड़े का उपयोग करने की आवश्यकता है।
जस्टिन बसर

8
@JustinBuser: "सवाल यह है कि क्या चूक जानबूझकर की गई थी या नहीं" - केवल वही लोग हैं जो Google पर उस काम का जवाब दे सकते हैं। यह जानने के लिए Google पर नौकरी पाने के लिए आपका स्वागत है। "आपके द्वारा बताए गए तरीके से वरीयता बढ़ाने का कोई साधन नहीं है" - आप उस कोड को डाउनलोड करने के लिए स्वागत करते हैं जिसे मैंने लिंक किया था।
कॉमन्सवेयर

9
@JustinBuser रिकॉर्ड के लिए, मार्क ने मेरे सवाल का जवाब दिया। मुझे उसका उत्तर स्वीकार करने से स्पष्ट है।
जेम्स

21

@CommonsWare से उत्तर का सूक्ष्म निहितार्थ यह है कि - आपके ऐप को संगतता API या अंतर्निहित खंड API (SDK 11 या तो) के बीच चयन करना होगा। वास्तव में यह है कि "आसानी से" सिफारिश की है। दूसरे शब्दों में, यदि आप वरीयता का उपयोग करना चाहते हैं, तो आपके ऐप को अंतर्निहित विखंडन एपीआई का उपयोग करने की आवश्यकता होती है और प्राथमिकता के आधार पर पदावनत तरीकों से निपटना होता है। इसके विपरीत, यदि यह महत्वपूर्ण है कि आपका ऐप कॉम्पिटिटर का उपयोग करे। API का सामना करना पड़ेगा, जिसमें आपके लिए एक प्राथमिकता वर्ग नहीं है। इस प्रकार, उपकरणों को लक्षित करना कोई समस्या नहीं है, लेकिन हूप-जंपिंग तब होती है जब आपको एक या दूसरे एपीआई का चयन करना होता है और इस प्रकार आप अपने डिजाइन को अनपेक्षित वर्कआर्स में जमा करते हैं। मुझे कॉम्पिटिटर की जरूरत है। एपीआई इसलिए मैं अपना स्वयं का प्राथमिकता वर्ग बनाने जा रहा हूं और देखता हूं कि यह कैसे काम करता है। सबसे खराब स्थिति में मैं '

EDIT: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google/android/android/4.0.1_r1/android/preference/PreferenceFragment.java पर कोड देखने और देखने के बाद ? av = h - अपनी खुद की वरीयता बनाने से कुछ होने वाला नहीं है। ऐसा प्रतीत होता है कि 'संरक्षित' के बजाय प्राथमिकता प्रबंधक में पैकेज-प्राइवेट का उदार उपयोग मुख्य अवरोधक है। यह वास्तव में ऐसा नहीं लगता है कि कोई भी सुरक्षा या वास्तव में अच्छी प्रेरणा है जिसने ऐसा किया है और यह यूनिट-परीक्षण के लिए महान नहीं है, लेकिन अच्छी तरह से ... कम टाइपिंग का अनुमान है ...

EDIT v2: वास्तव में यह हुआ और यह काम किया। यह निश्चित रूप से संगतता एपीआई जार के साथ कोड काम करने के लिए एक सिरदर्द था। मुझे एसडीके से अपने ऐप में लगभग 70% com.android.preference पैकेज कॉपी करना पड़ा और फिर एंड्रॉइड में आमतौर पर औसत दर्जे के जावा कोड के साथ कुश्ती करना पड़ा। मैंने SDK के v14 का उपयोग किया। एक Goog इंजीनियर के लिए यह करना बहुत आसान होगा कि मैंने क्या किया, मैंने इस विषय के बारे में कुछ लीड एंड्रॉइड इंजीनियरों को जो सुना है, उसके विपरीत है।

BTW - क्या मैंने कहा "उपकरणों को लक्षित करना कोई समस्या नहीं है"? यह पूरी तरह से है ... यदि आप com.android.preference का उपयोग करते हैं तो आप प्रमुख रिफैक्टरिंग के बिना संगतता एपीआई के साथ स्वैप करने में सक्षम नहीं होंगे। मज़ा लॉग!


मुझे और प्रत्यक्ष होने दो। यदि आप परवाह करते हैं कि हनीकॉम्ब और उच्च को लक्षित किया जा रहा है (जिसके पास कितना शेयर बाजार है?) तो @Commonsware से जवाब के लिए वोट करें! यदि आप आज बाजार के अधिकांश Android उपकरणों की परवाह करते हैं, तो आपको मेरी प्रतिक्रिया के माध्यम से पढ़ना चाहिए।
तेनुस्सले

4
क्या आप यह साझा करने के लिए तैयार हैं कि आपने यह कैसे किया? मैं बिल्कुल उसी समस्या में चल रहा हूं, केवल मेरी प्राथमिकता में लोडर का उपयोग करना है और इसलिए मुझे संगतता पुस्तकालय का उपयोग करना चाहिए
करकुरी

3
@ पूरी तरह से मुझे आपकी जाँच पसंद है - अच्छी तरह से किया गया। हालांकि, मुझे लगता है कि किसी को आपकी पहली टिप्पणी पर सीधे रिकॉर्ड सेट करना चाहिए - कॉमन्सवेयर का कोड एचसी उपकरणों को प्री और पोस्ट करने पर काम करेगा - इस तरह की टिप्पणी करने से पहले इसे पहले आज़माएं। आपको जिस चीज को महसूस करने की आवश्यकता है, वह पिछले उपकरणों के समर्थन के लिए रनटाइम पर उपयोग की जाने वाली लेट बाइंडिंग है। रनटाइम पर संस्करण की जाँच ओएस के दोनों परिवारों का समर्थन करने का ख्याल रखती है - यह एक सामान्य एंड्रॉइड पैटर्न है (मुझे पसंद नहीं है - लेकिन एक जो एंड्रॉइड डेवलपर्स के लिए सीखने और परिचित होने के लिए महत्वपूर्ण है) ... इसलिए भविष्य के पाठकों के लिए - डॉन या तो दृष्टिकोण को खारिज नहीं करेंगे।
रिचर्ड ले मेसियर

@RichardLeMesurier लेकिन कॉमन्सवेयर का तरीका उचित नहीं है अगर आपको DrawerLayout के अंदर वरीयताएँ चाहिए
newworld

16

कॉमन्सवेयर के जवाब के साथ-साथ तेनसिंग की टिप्पणियों के आधार पर, मैं एक एकल वंश श्रेणी के समाधान के साथ आया हूं जो सभी मौजूदा एंड्रॉइड एपीआई संस्करणों को न्यूनतम उपद्रव और कोई कोड या संसाधन दोहराव के साथ लक्षित करने में सक्षम है। कृपया संबंधित प्रश्न के बारे में मेरा जवाब यहाँ देखें: वरीयताऐ एंड्रॉइड 4.0 और इससे पहले का

या मेरे ब्लॉग पर: http://www.blackmoonit.com/2012/07/all_api_prefsactivity/

4.0.3 और 4.0.4 के साथ-साथ 4.0.4 और 2.3.3 पर चलने वाले एक फोन पर टेस्ट किए गए दो टैबलेट और 1.6 पर चलने वाला एमुलेटर भी।



10

अगस्त 2015 को Google ने नई वरीयता समर्थन लाइब्रेरी v7 जारी किया ।

अब आप किसी भी या किसी के साथ पसंद कर सकते हैंActivityAppCompatActivity

public static class PrefsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

आपको preferenceThemeअपनी थीम में सेट करना होगा :

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

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


1
मुझे लगता है कि आपको एक समारोह याद है: onCreatePreferences
Android डेवलपर

इससे मेरा दिन बच गया! मुझे आश्चर्य है कि यह एंड्रॉइड स्टूडियो के प्रोजेक्ट स्ट्रक्चर में क्यों नहीं दिखाई देता है ... ?? BTW आप अपने कोड में एक टाइपो है। होना चाहिए "फैलीफ्रेगमेंटमेंटकंपैट"
ग्रेज़गोरज़ डी।

7

टेनोरियस का उत्तर सही है, लेकिन यहां कुछ और विवरण हैं।

इसका कारण यह है कि आप "एक सामान्य लेआउट नहीं बना सकते हैं और व्यू कंपोनेंट्स को मैन्युअल रूप से साझा कर सकते हैं" यह है कि android.preferences API में कुछ आश्चर्यजनक चूक हैं। वरीयता और प्राथमिकता दोनों ही महत्वपूर्ण गैर-सार्वजनिक प्राथमिकता प्रबंधक विधियों तक पहुंच है, जिसके बिना आप अपने स्वयं के प्राथमिकता यूआई को लागू नहीं कर सकते।

विशेष रूप से, XML फ़ाइल से वरीयता पदानुक्रम का निर्माण करने के लिए आपको एक प्राथमिकता प्रबंधक का उपयोग करने की आवश्यकता होती है, लेकिन प्राथमिकता प्रबंधक के सभी निर्माता या तो पैकेज-निजी या छिपे हुए हैं। अपनी गतिविधि पर पसंद के श्रोताओं को पसंद करने की विधि भी पैकेज-निजी है।

और आप android.preferences पैकेज में अपने कार्यान्वयन को चुपके से लगाकर इसके आस-पास काम नहीं कर सकते, क्योंकि एंड्रॉइड एपीआई में गैर-सार्वजनिक तरीके वास्तव में एसडीके से छोड़े गए हैं। प्रतिबिंब और गतिशील परदे के पीछे की रचनात्मकता के साथ, आप अभी भी उन पर प्राप्त कर सकते हैं। एकमात्र विकल्प, जैसा कि टेनसिएस कहता है, पूरे android.preference पैकेज को कांटा करना है, जिसमें कम से कम 15 कक्षाएं, 5 लेआउट, और इसी तरह की शैली। xml और attrs.xml तत्व शामिल हैं।

इसलिए मूल प्रश्न का उत्तर देने के लिए, Google ने संगतता पैकेज में वरीयता शामिल नहीं की है, क्योंकि उनके पास तेनुस्फ़ेस और स्वयं के समान कठिनाई थी। यहां तक ​​कि Google समय पर वापस नहीं जा सकता है और उन तरीकों को पुराने प्लेटफार्मों में सार्वजनिक कर सकता है (हालांकि मुझे आशा है कि वे भविष्य के रिलीज में ऐसा करते हैं)।


2

मेरा ऐप लक्ष्य API +14 है, लेकिन कुछ फैंसी नेविगेशन के लिए सपोर्ट लाइब्रेरी का उपयोग करने के कारण, मैं उपयोग नहीं कर सकता android.app.Fragmentथा और उपयोग करना था android.support.v4.app.Fragment, लेकिन मुझे PreferenceFragmentकोड बदलने के लिए बड़े बदलावों के बिना भी जगह की आवश्यकता थी।

तो समर्थन पुस्तकालय के दोनों दुनिया होने के लिए मेरा आसान तय है और PreferenceFragment:

private android.support.v4.app.Fragment fragment;
private android.app.Fragment nativeFragment = null;

private void selectItem(int position) {
    fragment = null;
    boolean useNativeFragment = false;
    switch (position) {
    case 0:
        fragment = new SampleSupprtFragment1();
        break;
    case 1:
        fragment = new SampleSupprtFragment2();
        break;
    case 2:
        nativeFragment = new SettingsFragment();
        useNativeFragment = true;
        break;
    }
    if (useNativeFragment) {
        android.app.FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
            .replace(R.id.content_frame, nativeFragment).commit();
    } else {
        if (nativeFragment != null) {
            getFragmentManager().beginTransaction().remove(nativeFragment)
                .commit();
            nativeFragment = null;
        }
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
            .replace(R.id.content_frame, fragment).commit();
    }
}

2

मुझे एप्लिकेशन के डिज़ाइन में प्राथमिकताएं एकीकृत करने और 2.3 एंड्रॉइड के लिए समर्थन रखने की आवश्यकता थी। इसलिए मुझे अभी भी प्राथमिकताएँ चाहिए।

कुछ खोज के बाद मुझे android-support-v4-प्राथमिकताफ्रैगमेंट लिबास मिला। मूल रूप से प्रीफ्रैंस फ़्रेग्मेंट को कॉपी और रिफैक्ट करने में इस लिबास में बहुत समय की बचत होती है। ठीक काम करता है और उपयोगकर्ता वरीयताओं का आनंद लेते हैं।

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