2014-07-24 17 views
7

के भीतर से ओवरले पर एक्शनबार बदलें, मेरे पास एक टुकड़ा (टुकड़ा 1) है जिसे दूसरे खंड (फ्रैगमेंट 2) द्वारा प्रतिस्थापित किया गया है। टुकड़ा 1 ढेर पर रखा गया है। मैं संगतता मोड का उपयोग कर रहा हूं (एक्शनबार शेरलॉक नहीं)।फ्रैगमेंट

यहां मेरी समस्या है। मैं कुछ टुकड़ों में ओवरले के रूप में एक्शनबार को प्रदर्शित करना चाहता हूं, लेकिन दूसरों में नहीं। विशेष रूप से, जब फ्रैगमेंट 2 दिखाया जाता है, तो मैं इसे ओवरले में दिखाना चाहता हूं और फिर फ्रैगमेंट 2 निकलने के बाद सामान्य एक्शनबार पर वापस जाना चाहता हूं।

टुकड़े 1 में एक नियमित एक्शनबार होता है जो हमेशा दिखाई देता है। लेकिन, जब मैं फ्रैगमेंट 1 को फ्रैगमेंट 2 के साथ प्रतिस्थापित करता हूं, तो मुझे 5 सेकंड के बाद एक्शनबार को छिपाने की आवश्यकता होती है। यदि कोई स्पर्श ईवेंट है, तो एक्शनबार फिर से दिखाया गया है। यह सब ठीक काम करता है, लेकिन, कार्रवाई बार छुपा या प्रकट होने पर हर बार फ्रैगमेंट 2 को फिर से खींचा जाता है। इस वजह से, मैं फ्रेगमेंट 2 शो में एक्शनबार को ओवरले के रूप में बनाना चाहता हूं।

मुझे पता है कि मैं एक्शनबार ओवरले बदल सकता हूं लेकिन मुझे नहीं पता कि यह प्रोग्रामिंग रूप से टुकड़े के भीतर से कैसे किया जाए। मैं इसे प्रत्येक टुकड़े के लिए बदलना नहीं चाहता, केवल टुकड़ा 2.

विचार ?????

+0

एक्शनबार गतिविधि निर्भर हैं, इसके लिए समाधान संभव नहीं है डिफ़ॉल्ट कार्रवाई के साथ आप लेआउट की तरह अपनी खुद की एक्शनबार बनाना चाहते हैं और फिर आप इसके ऊपर अधिक नियंत्रण प्राप्त कर पाएंगे। अगर आप टाइटल बार –

+0

के लिए एक्शन बार का उपयोग कर रहे हैं तो मैं इसे पुन: प्रस्तुत कर दूंगा, मैं समझता हूं कि एक्शनबार गतिविधि निर्भर हैं। और मैं एक शीर्षक पट्टी से अधिक के लिए एक्शनबार का उपयोग कर रहा हूँ। मैं क्या सोच रहा हूं कि अगर मुख्य गतिविधि में वापस बुलाकर टुकड़े के भीतर से एसीओनबार को बदलने का कोई तरीका है। समस्या यह है कि मुझे प्रोग्रामेटिक रूप से ऐसा करने की आवश्यकता होगी क्योंकि थीम (मुझे लगता है) के माध्यम से बदलाव लागू करने में बहुत देर हो चुकी है। ????? – JustLearningAgain

+0

यदि मैं समझता हूं कि आप चाहते हैं कि आप अपने टुकड़े से एक्शन बार को संशोधित कर सकें? –

उत्तर

10

यह वह उत्तर नहीं हो सकता है जिसकी आप उम्मीद कर रहे थे।

एक अलग प्रश्न पर विचार करें: क्या हम setContentView(...) के बाद गतिविधि विषय बदल सकते हैं? सवाल कई बार पूछा गया है, और एक सामान्य समाधान फिर से बनाना है (finish() और startActivity(getIntent()) पर कॉल करना) गतिविधि और setContentView(...) से पहले नई थीम सेट करें।

आपका प्रश्न इस पर एक विस्तार है - एक टुकड़े से विषय बदलने की अतिरिक्त जटिलता के साथ। किसी भी मामले में, मैं एक अच्छे से ऊपर उल्लिखित समाधान पर विचार नहीं करता हूं।

एक्शनबार एक गतिविधि बनने पर शुरू होने वाले पहले घटकों में से एक है। मुझे नहीं लगता कि आपको किसी भी तरह से नए गुणों के साथ 'रीफ्रेश' करने का कोई तरीका मिलेगा। कैसे के बाद setContentView (...) के साथ requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY) विधि सौदों कॉल नीचे देखें:

@Override 
public boolean requestFeature(int featureId) { 
    if (mContentParent != null) { 
     throw new AndroidRuntimeException("requestFeature() must be 
                 called before adding content"); 
    } 
    .... 
    .... 
} 

तो, एक क्रम-अपवाद setContentView(...) पहले से ही गतिविधि (जो भी हो, आपके मामले में) के लिए बुलाया गया है अगर फेंक दिया जाएगा।

क्या यह संभव है कि आपको इस कार्यक्षमता की भी आवश्यकता न हो?

<item name="android:windowActionBarOverlay">true</item> 
<!-- Support library attribute for compatibility --> 
<item name="windowActionBarOverlay">true</item> 

यहाँ मेरी समस्या है:

प्रारंभ ActionBar सेट करके अपने विषय में एक उपरिशायी किया जाना है। मैं कुछ टुकड़ों में ओवरले के रूप में एक्शनबार को प्रदर्शित करना चाहता हूं ...

ठीक है। हम पहले से ही इसके लिए प्रावधान कर चुके हैं।

... लेकिन दूसरों में नहीं।

कहें कि आप एक्शनबार को फ्रैगमेंट बी में ओवरले के रूप में नहीं रखना चाहते हैं।फिर, टुकड़ा बी के लेआउट में, निम्न करें:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?android:attr/actionBarSize" > <<<-- ?attr/actionBarSize 
                    for compatibility 

    .... 
    .... 
</LinearLayout> 
शीर्ष मार्जिन ActionBar के आकार करने के लिए सेट के साथ

, टुकड़ा बी लगता है कि यह एक नियमित रूप से ActionBar है - नहीं एक मढ़ा एक। इसे प्राप्त करने का एक और तरीका View होगा android:layout_height="?android:attr/actionBarSize" ऊपर लेआउट में पहले बच्चे के रूप में रखा गया है।

संक्षेप में:

  • अपने ActionBar एक उपरिशायी हो जाएगा।
  • उन टुकड़ों में जहां एक्शनबार स्वचालित रूप से छिपाएगा, टुकड़े लेआउट में कोई शीर्ष-मार्जिन सेट नहीं होगा।
  • उन टुकड़ों में जहां एक्शनबार को ओवरलैड नहीं किया जाना चाहिए, टुकड़े लेआउट शीर्ष-मार्जिन actionBarSize पर सेट होगा।

नोट की एक बिंदु (Jelle करने के लिए धन्यवाद):

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

+1

मैं इस विधि का भी उपयोग करता हूं। यदि आपकी 'लीनियरलाउट' की कस्टम पृष्ठभूमि है, तो 'marginTop' के बजाय' पैडिंगटॉप 'का उपयोग करना बेहतर हो सकता है। – Jelle

+1

@ जेले आह हाँ। आप सही हे। यदि एक्शनबार (अर्ध) -transparent है, तो पैडिंग का उपयोग करने का आपका विचार सबसे अच्छा काम करेगा। लेकिन अगर एक्शनबार में अपारदर्शी पृष्ठभूमि/रंग होता है, तो मार्जिन बेहतर होगा - कोई ओवरड्रा नहीं। मैं इसे शामिल करने के लिए अपना जवाब संपादित करूंगा। धन्यवाद। – Vikram

+0

ओवरड्रा के बारे में अच्छी सोच! – Jelle