Android-support-v4 के साथ वरीयता के विकल्प


90

मैं अपने ऐप के विकास में अचानक रुकावट आया हूं क्योंकि मुझे एहसास हुआ कि इस लाइब्रेरी में प्राथमिकताएं समर्थित नहीं थीं। क्या कोई विकल्प है जो एक रूकी एंड्रॉइड डेवलपर इस बाधा को दूर करने के लिए उपयोग कर सकता है?

यह मेरी मुख्य खिड़की है

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>

                <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            />

</TabHost>
</LinearLayout>

अपनी TabActivity के लिए मैं कुछ ऑनलाइन इस्तेमाल कर रहा हूं। यहाँ एक स्निपेट है:

public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener 
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;

private class TabInfo {
     private String tag;
     private Class clss;
     private Bundle args;
     private Fragment fragment;
     TabInfo(String tag, Class clazz, Bundle args) {
         this.tag = tag;
         this.clss = clazz;
         this.args = args;
     }

}

class TabFactory implements TabContentFactory 
{

    private final Context mContext;

    /**
     * @param context
     */
    public TabFactory(Context context) {
        mContext = context;
    }

    /** (non-Javadoc)
     * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
     */
    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }

}

...*snip*...

क्या Android-support-v4 संगतता लायब्रेरी का उपयोग कर किसी प्राथमिकता (या प्राथमिकता) के समान कुछ लागू करने के लिए कोई है?



वास्तव में एक डुप्लिकेट नहीं है क्योंकि मैं ऐसी स्थिति में हूं, जहां मुझे एक टैबहॉस्ट के भीतर दिखाए जाने के लिए इन प्राथमिकताओं की "आवश्यकता" है। मेरा संपादन देखें
CodePrimate

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

जवाबों:


86

UPDATE - 6/11/2015

अब समर्थन-v7 लाइब्रेरी शामिल है PreferenceFragmentCompat। इसलिए इसका इस्तेमाल करना बेहतर होगा।


अपने प्रोजेक्ट में निम्नलिखित प्रोजेक्ट को एक लाइब्रेरी प्रोजेक्ट के रूप में जोड़ें।

https://github.com/kolavar/android-support-v4-preferencefragment

आप अपने अंश लेनदेन सहित सब कुछ रख सकते हैं जैसा कि यह है। PreferenceFragmentवर्ग आयात करते समय , सुनिश्चित करें कि सही आयात शीर्ष लेख उपयोगकर्ता है।

import android.support.v4.preference.PreferenceFragment;

के बजाय

import android.preference.PreferenceFragment;

4
उस गितुब कोड में गंभीर मुद्दे हैं ... मैं उपयोग नहीं कर सकता हूं RingtonePreferenceऔर यह OnSharedPreferenceChangeListenerभी नहीं लगता है कि कोई भी परिवर्तन हो!
पागल

2
मैं सोच रहा था कि इस पुस्तकालय का उपयोग करना एक अच्छा विचार है। लेकिन मुझे एहसास हुआ कि यह उतना अच्छा नहीं है जितना मैंने सोचा था। onPrepareOptionMenuविधि को ओवरराइड करने की कोशिश मुझे एक अजीब हस्ताक्षर (रिटर्न void) दिखाती है जो कि डिफ़ॉल्ट रूप से भिन्न है जिसे हम सभी जानते हैं (रिटर्न boolean) !!! एक गंभीर मुद्दा।
S.Thiongane

9
जब भी आप मैड्रिड में आते हैं, तो आप एक नि: शुल्क रात्रिभोज के हकदार होते हैं ... यह मुद्दा मुझे पागल कर रहा था!
दोपहर

7
@mansoulx onPrepareOptionsMenu में हमेशा टुकड़ों पर शून्य वापसी प्रकार होता है (गतिविधियों के लिए, जिसके लिए यह बूलियन है), इसलिए यह हस्ताक्षर पूरी तरह से अपेक्षित है।
कुंभाय

3
लाइब्रेरी के साथ मुद्दों को शायद गिटब प्रोजेक्ट पर रिपोर्ट किया जाना चाहिए।
मैथिज्स सीन

128

मैं जानता हूँ कि यह एक पुराने सवाल यह है, लेकिन अब आप उपयोग कर सकते हैं PreferenceFragmentCompatसेcom.android.support:preference-v7:23.3.0


4
शानदार खोज, यह अब सही उत्तरों में से एक है।
मैथुल

मेरे लिए यह केवल com.android.support.preference-v7:23.0.1 के साथ काम करता है।
फेलिप मोसो

1
एंड्रॉइड स्टूडियो से इसे जोड़ने की कोशिश करने पर यह निर्भरता सर्वर पर नहीं लगता है। क्या मुझे इसके लिए भंडार जोड़ने की आवश्यकता है?
ब्रिल पप्पिन

इसमें वह क्लास नहीं है
JJ Ab

1
मैंने गलती से इस उत्तर को उखाड़ फेंका और अब मैं इसे पूर्ववत नहीं कर सकता, इसलिए इसके बजाय मैं केवल PreferenceFragmentCompatकुछ प्रमुख मुद्दों पर ध्यान दूंगा : यह और यह बग रिपोर्ट देखें, उदाहरण के लिए, और कई और अधिक । मैं PreferenceActivityइसके बजाय पदावनत का उपयोग कर समाप्त हो गया । sigh
विक्की चिजवानी '

16

महत्वपूर्ण अपडेट: नवीनतम संशोधन की v7 support libraryअब एक देशी है PreferenceFragmentCompat

मैं इस पुस्तकालय का उपयोग कर रहा हूं , जिसमें एक AARहै mavenCentralताकि आप आसानी से इसे शामिल कर सकें यदि आप उपयोग कर रहे हैं Gradle

compile 'com.github.machinarius:preferencefragment:0.1.1'


क्या आप साझा कर सकते हैं कि आप कैसे आयात करते हैं और समर्थन टुकड़े का विस्तार करते हैं? धन्यवाद
स्टीवन

1
@ सच ज़रूर! मैंने एक जिस्म बनाया ।
दिबांग

@mattblang बहुत बहुत धन्यवाद!
स्टीवन

@mattblang धन्यवाद बहुत ... आपकी मदद से मेरा बहुत समय बचता है
असद उल्लाह रफीक

अपवाद java.lang.RuntimeException: सामग्री में id विशेषता 'android.R.id.list' है, जो सूची दृश्य वर्ग नहीं है
अब्दुल रहमान

10

आप मेरा खुद का उपयोग कर सकते हैं PreferenceFragment

यह सरल है और मेरे पास अब तक इसके साथ कोई समस्या नहीं थी। मुझे लगता है कि आप एक बार में केवल एक ही गतिविधि में प्रदर्शन कर सकते हैं, जो ठीक होना चाहिए।


9

प्राथमिकताएँ समर्थन लाइब्रेरी: एपीआई 7+ के लिए वरीयता अंश, कोई फर्क नहीं पड़ता गतिविधि

एक सरल कार्यान्वयन में एक प्राथमिकता शामिल होगी जैसे कि:

public class PreferencesFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);
    }
}

आपको अपनी थीम में तरजीह सेट करने की आवश्यकता होगी:

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

और इसे निर्भरता में जोड़ें: http://developer.android.com/tools/support-library/features.html

com.android.support:preference-v14:23.1.0

7

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


1
मैं एक प्राथमिकता का उपयोग नहीं कर सकता, क्योंकि मेरे बाकी ऐप टैबविजेट के हैं। वरीयता को टैबविजेट के ऊपर दिखाया जाना चाहिए। मुझे इसे पूरी तरह से स्क्रीन पर ले जाने के बजाय एक गतिविधि बनाना था।
कोडप्राइम

2
फिर कुछ कस्टम सूची के टुकड़े का उपयोग करें
zapl

2

आप Android के सभी संस्करणों के लिए एकल API का उपयोग करने के लिए UnifiedPreferences जैसे तीसरे पक्ष के पुस्तकालयों का उपयोग कर सकते हैं ।


0

आप इसके बजाय प्राथमिकता से विस्तार कर सकते हैं , और यदि आप एक ActionBar रखना चाहते हैं, तो आप इसे टूलबार का उपयोग करके जोड़ सकते हैं प्राथमिकता के लिए उपयोग किए गए ListView से ऊपर होने के नाते हैं।

यह वर्टिकल लिनियर लाइट का उपयोग करके किया जा सकता है जो टूलबार और Android के साथ एक सूची दृश्य रखता है : id = "@ android: id / list"

आप चाहें तो यहाँ मेरा समाधान देख सकते हैं ।


0

जैसा कि लुसियस ने कहा कि आप वरीयता-लाभ का उपयोग कर सकते हैं :

public class MyPreferenceFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle bundle, String s) {               
            PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
            addPreferencesFromResource(R.xml.preferences);
       }
}

आपको अपनी निर्भरता को श्रेणी में शामिल करना होगा:

dependencies {
...
    compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...)
...
}

इस तरह आप android.support.v4.app.FragmentTransaction और PrefernceFragment के FragmentTransaction का भी उपयोग कर सकते हैं। हालाँकि, हो सकता है कि आपको थीम से कोई समस्या हो। यदि यह मामला है, तो आप इसे इस पोस्ट को ध्यान में रखते हुए हल कर सकते हैं:

एपीआई 14+ पर सामग्री विषय रखते हुए एपीआई 7+ पर काम करने का समाधान

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