java प्राथमिकता में एक्शनबार




android android-layout (7)

मेरे आवेदन में मैं Google से नई एक्शन बार संगतता नमूने का उपयोग कर रहा हूं ( <sdk>/samples/android-<version>/ActionBarCompat ) जो महान काम करता है एंड्रॉइड मार्केट में सेटिंग्स की तरह एक स्क्रीन प्राप्त करने के लिए मेरे पास केवल एकमात्र समस्या यह है कि मेरी PreferenceActivity लिए यह आवेदन कर रहा है (चित्र देखें)।

माउस के साथ ActionBar को भरने के लिए, प्रत्येक Activity को ActionBarActivity वर्ग का विस्तार करना चाहिए समस्या यह है कि मेरी Activity पहले से PreferenceActivity प्रदान करती है और जावा कक्षाओं में एक से अधिक वर्गों का विस्तार नहीं हो सकता है।

ActionBar को PreferenceScreen ActionBar साथ मिलाने का एक तरीका होना चाहिए। मुझे खुशी होगी अगर कोई इस सामान्य समस्या के समाधान प्रदान कर सकता है।

पीएस: ActionBar वास्तव में शीर्षक बार है और इसलिए यह एक लेआउट चीज़ से जावा अधिक है क्योंकि PreferenceScreen के लिए एक बटन जोड़ने के लिए कैसे में एक समाधान फिट नहीं है जैसे समाधान।


संपादित करें: मेरा जवाब नीचे है, बल्कि यह हैकी है और ऐसा लगता है कि यह अब पुराना है (एंड्रॉइड 3.0 के लिए) कम हैकी और अधिक मौजूदा समाधान के लिए अन्य उत्तरों पर एक नज़र डालें ~ pyko 2014-09-01

मैं इसे काम करने में कामयाब रहा - यह सुनिश्चित नहीं है कि यह सबसे अच्छा / साफ समाधान है, लेकिन यह काम करता है।

निम्नलिखित परिवर्तन करना था:

  1. ActionBarActivity की एक प्रति बनाओ और नए वर्ग की PreferenceActivity ActionBarActivity

    public abstract class ActionBarPreferenceActivity extends PreferenceActivity {
        // contents exactly the same as 'ActionBarActivity'
    }
  2. ActionBarHelperBase.java में ActionBarHelperBase.java onCreate() थोड़ा - PreferenceActivity कक्षाओं के लिए एक विशेष मामला बनाओ

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // If the activity is a PreferenceActivity, don't make the request
        if (!(mActivity instanceof PreferenceActivity)) {
            mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        }
  3. अपनी पसंदीदा गतिविधि इस वर्ग को super.onCreate() कॉल करने से पहले FEATURE_CUSTOM_TITLE लिए अनुरोध जोड़ें। super.onCreate()

    public class MyPreferenceActivity extends ActionBarPreferenceActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); // add this line
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            // etc etc
        }
    
        // etc etc
    }

जहां तक ​​मैं बता सकता हूं, बदलाव 2 और 3 की वजह से PreferenceActivity लिए आवश्यक हैं:

"जैसे ही आप super.onCreate () कहते हैं, ViewGroup सेट हो जाएगा और इसलिए, आपको विंडो के मापदंडों को बदलने की अनुमति नहीं है।" ( जवाब देने के लिए ओलिवर की टिप्पणी देखें )

मुझे लगता है कि PreferenceActivity गतिविधियां गतिविधियों में किस प्रकार घटित की जाती हैं, यह सादे Activity गतिविधियों से अलग है।


यदि आप समर्थन-वी 4 टुकड़े के आधार पर एक प्राथमिकता निर्धारण कार्यान्वयन करना चाहते हैं:

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

मैं इसे स्वयं का उपयोग कर रहा हूं और वरीयताप्रबंधन में वरीयता प्रस्ताव को मोड़ने के लिए यह बहुत काम नहीं है।


क्या आप केवल ActionBarActivity के लिए कोड क्लोन कर सकते हैं, और "फैमिली ऐक्टिविटी बढ़ाता है" के लिए "फैली हुई गतिविधि" को बदल सकते हैं? फिर ActionBarActivity के बजाय अपनी नई कक्षा का विस्तार करें

मैंने देखा है कि सभी गूगल ऐप से, हालांकि, एक PreferenceActivity के एक्शन बार में बटन डाल असामान्य लगता है यदि आप इस पर बटन नहीं डाल रहे हैं, तो आप हॉलो थीम को दिखाने के लिए सिर्फ एक वैल्यू-v11 वैकल्पिक शैली संसाधन का उपयोग कर सकते हैं, और अपनी पसंद के लिए मैनिफेस्ट में उस शैली को सेट कर सकते हैं।


आप ActionBarSherlock lib प्राप्त कर सकते हैं और आपको कोड को SherlockPreference तक बढ़ाया जा सकता है;


मैं @पीको के लिए एक महान उत्तर प्रदान करने के लिए धन्यवाद देना चाहता हूं, लेकिन इसमें समस्या यह है कि यह हनीकॉम्ब और इसके बाद के संस्करण पर अच्छी तरह से काम नहीं करेगा अच्छी तरह से आप इसे @AndroidDev की तरह चारों ओर पाने के लिए एक हैक तरीका हो सकता है; लेकिन @पीको एक्शनबेल हेलरबेस वर्ग को प्रदूषित करने वाला है, और @AndroidDev बहुत पारदर्शी नहीं है। सबसे अच्छा तरीका है एक्शनबाराएक्टिविटी प्राथमिकताएं जो प्राथमिकता से फैली हुई हैं; और ऑन क्रेट विधि में, पेरेंट विधि को कॉल करने का क्रम परिवर्तित करें:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //IMPORTATNT: MAKE SURE actionBarHelper called before super;
    //as super oncreate of prefenceactivity is actuallying setting the content view
    mActionBarHelper.onCreate(savedInstanceState);
    super.onCreate(savedInstanceState);
}

क्यों कॉल 'mActionBarHelper.onCreate (सहेजे गए इन्स्टैंसस्टेट);' 'सुपर' से पहले (सहेजे गए इन्स्टेंसस्टेट); ' , क्योंकि सुपर (यानी प्राधानिकता) वास्तव में सामग्री दृश्य को अपनी क्रिएट विधि में सेट कर रहा है, जो दुर्घटना का कारण बनता है ("सामग्री जोड़ने से पहले" requestFeature () को कॉल किया जाना चाहिए)। इसलिए ऑर्डर स्वैप करने के लिए आपको क्या करने की आवश्यकता है सुनिश्चित करें कि 'mActionBarHelper.onCreate (सहेजे गए इन्स्टेंसस्टेट);' सुपर से पहले कहा जाता है। इस तरह, हमें 'एक्शनबेलहल्परबेज' को प्रदूषित करने की ज़रूरत नहीं है, फिर भी हम सेटिंग ऐक्टिविटी बहुत साफ रखती हैं क्योंकि हम 'एक्शनबैरविटिविटीप्रेरेन्शंस' के लिए कड़ी विस्तार की व्याख्या करते हैं और बैंग!


मैंने अपने आवेदन में इस एक्शनबार में इस्तेमाल किया https://github.com/johannilsson/android-actionbar और यह इस थ्रेड के साथ अच्छा काम है।


आप निम्न परिवर्तनों से वरीयता गतिविधि में आसानी से एक्शन बार जोड़ सकते हैं:

AndroidManifest.xml में :

<activity
        android:name=".activity.SettingsActivity"
        android:theme="@style/SettingsTheme"
        android:label="Settings"/>

V21 / styles.xml में

<style name="SettingsTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

पीछे API समर्थन के लिए v14 / styles.xml में :

<style name="SettingsTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/ActionBar.V14.Movie.NoTitle</item>
</style>




android-preferences