2010-07-07 14 views
26

इसलिए मैंने कस्टमटाइटलबार एक्टिविटी नामक एक गतिविधि उप-वर्ग बनाया है। अनिवार्य रूप से, मेरे ऐप में प्रत्येक मुख्य गतिविधि में एक कस्टम टाइटलबार होगा जिसमें होम बटन, एक शीर्षक, एक खोज बटन इत्यादि जैसी कई सामान्य विशेषताएं होंगी। मेरे वर्तमान कार्यान्वयन में, मैं अभी भी स्पष्ट रूप से लेआउट एक्सएमएल में एक कथन का उपयोग कर रहा हूं प्रत्येक CustomTitlebarActivity:एंड्रॉइड प्रोग्रामेटिक रूप से लेआउट (यानी एक्सएमएल के बिना)

<include layout="@layout/titlebar" /> 

यह प्राकृतिक लगता है कि मैं CustomTitlebarActivity भीतर यह करने के लिए सक्षम होना चाहिए। मेरे पास दो प्रश्न हैं: इसमें कौन सा कोड बदल सकता है टैग शामिल है, और मुझे कोड कहां रखना चाहिए? (मेरा पहला वृत्ति इसे कस्टमटाइटलबार एक्टिविटी की सेटकंटेंट व्यू विधि में रखना होगा।)

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

उत्तर

14

व्यक्तिगत रूप से, मैं शायद अपने Activity उपवर्ग हमेशा setContentView करने के लिए एक लेआउट फ़ाइल एक ऊर्ध्वाधर fill_parentLinearLayout युक्त सिर्फ अपने शीर्षक पट्टी युक्त करने के लिए लिखना चाहते हैं: -

<LinearLayout android:id="@+id/custom_titlebar_container" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <!--titlebar here--> 
</LinearLayout> 

तो मैं एक सार निर्धारित करेंगे getContentAreaLayoutId() मिले CustomTitlebarActivity में होड जो प्रत्येक सबक्लास के लिए टाइटलबार के नीचे सामग्री के लेआउट ID लेता है; CustomTitlebarActivity के आधार onCreate() तो बस

setContentView(R.layout.custom_titlebar_activity_frame_from_above); 
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container)); 

वैकल्पिक रूप से कहेंगे, सामग्री क्षेत्र एक int के बजाय एक View वापसी प्राप्त करने के लिए आप अपने सार विधि हो सकता था, आप गतिशील रूप से अपने विचार निर्माण करने के लिए और अधिक लचीलापन दे रही है (लेकिन आप के लिए मजबूर उन्हें सरल में स्वयं को फुलाएं ताकि इस XML लेआउट को केस पर डंप करें)।

+0

यह कॉन्फ़िगरेशन चाल है, मैं इसके साथ और अधिक प्रयोग करूंगा। इस तरह के टाइटलबार पर एक्शन बटन की अलग-अलग व्यवस्था की अनुमति देने के बारे में कोई अच्छा विचार? –

+0

यह निर्भर करता है, लेकिन यदि पर्याप्त अनुमानित अनुकूलन (एक या दो कस्टम बटन/कार्रवाइयां) की सीमित मात्रा है, तो शायद मैं "छवि का उपयोग करने के लिए उप-वर्गों द्वारा अधिलेखित अमूर्त विधि" और चीज़ लेने के लिए कार्रवाई (जैसे) एक अमूर्त getFirstActionImageResourceId(), onFirstActionClicked()) और बस उन्हें बेस क्लास के ऑनक्रेट() में हुक करें। –

49

मैं भी इस मुद्दे से मुलाकात की, और मैंने अभी इसे हल किया है। मुझे लगता है कि मेरी हल है आसान:

View childLayout = inflater.inflate(R.layout.child, 
      (ViewGroup) findViewById(R.id.child_id)); 
  • माता-पिता में जोड़ें::

    parentLayout.addView(childLayout); 
    
  • LayoutInflater inflater = (LayoutInflater)  this.getSystemService(LAYOUT_INFLATER_SERVICE); 
    
  • बच्चे लेआउट बढ़:

    1. एक inflater बनाने

    यह किया गया है, इसका आनंद लें!

  • +1

    <लेआउट = "@ लेआउट/टाइटलबार" /> –

    +7

    के लिए सटीक उत्तर मुझे लगता है कि यह 'findViewById (R.idout.child_id) होना चाहिए;' 'R.layout.child_id' – Ranjit

    +0

    जब मैं ऐसा करता हूं चौड़ाई नहीं लेआउट में परिभाषित के रूप में रहने लगते हैं। पता नहीं क्यों –

    संबंधित मुद्दे