2013-07-07 3 views
23

एंड्रॉइड व्यू ग्रुप क्लास को विस्तारित करते समय, onLayout() ओवरराइड का उद्देश्य क्या है? मैं एंड्रॉइड में कस्टम नियंत्रण कर रहा हूं लेकिन किसी कारण से सामग्री (बच्चे View ऑब्जेक्ट्स) प्रदर्शित नहीं हो रहा है। मेरा दृष्टिकोण व्यू ग्रुप क्लास को विस्तारित करना था, व्यू ग्रुप की addView() विधि के माध्यम से बाल-दृश्य जोड़ना। फिर, अपने मुख्य गतिविधि में, मैं निम्नलिखित कोड है:एंड्रॉइड व्यू ग्रुप: मुझे ऑनआउट() ओवरराइड में क्या करना चाहिए?

ChannelController myCC = new ChannelController(this); 
setContentView(myCC); 

ChannelController अपने कस्टम वर्ग का नाम है कि ViewGroup फैली हुई है। मुझे कुछ गलत करना होगा क्योंकि स्क्रीन पर कुछ भी नहीं दिखाया गया है।

मैं समझता हूँ कि मैं ओवरराइड और onLayout() विधि को लागू करना चाहिए, लेकिन क्या साथ? मुझे पता है कि dev.android साइट पर इसके लिए समर्पित एक संपूर्ण पृष्ठ है, लेकिन इससे मुझे बहुत मदद नहीं मिली, क्योंकि ज्यादातर मुझे लगता है कि मैं नौसिखिया हूं। किसी भी जानकारी की सराहना की जाएगी।

संदर्भ के लिए, मेरी ViewGroup विस्तार से नीचे दिखाई देता है:

public class ChannelController extends ViewGroup { 

    final String TAG = "JAL"; 

    public ChannelController(Context c) 
    { 
     super(c); 
     init(c); 
    } 

    public ChannelController(Context c, AttributeSet attibset) 
    { 
     super(c); 
     init(c); 
    } 

    public ChannelController(Context c, AttributeSet attribset, int defStyle) 
    { 
     super(c); 
     init(c); 
    } 

    public void init(Context c) 
    { 
     //RelativeLayout wrap = new RelativeLayout(c); 
     RelativeLayout.LayoutParams wrapLP = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.MATCH_PARENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     RelativeLayout r1 = new RelativeLayout(c); 
     RelativeLayout.LayoutParams r1LP = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.MATCH_PARENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     RelativeLayout r2 = new RelativeLayout(c); 
     RelativeLayout.LayoutParams r2LP = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.MATCH_PARENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     TextView t = new TextView(c); 
     RelativeLayout.LayoutParams tlp = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     Button m = new Button(c); 
     RelativeLayout.LayoutParams mlp = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     Button s = new Button(c); 
     RelativeLayout.LayoutParams slp = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     SeekBar f = new SeekBar(c); 
     RelativeLayout.LayoutParams flp = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

     t.setId(1); 
     m.setId(2); 
     s.setId(3); 
     f.setId(4); 
     r1.setId(5); 
     r2.setId(6); 

     t.setText("CHANNELNAME"); 
     t.setTextColor(Color.BLACK); 
     tlp.setMargins(30, 0, 0, 0); 
     tlp.addRule(RelativeLayout.LEFT_OF, m.getId()); 
     tlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     tlp.addRule(RelativeLayout.CENTER_VERTICAL); 
     tlp.addRule(RelativeLayout.CENTER_HORIZONTAL); 

     m.setText("M"); 
     m.setBackgroundColor(Color.rgb(237, 155, 31)); 
     m.setTextColor(Color.WHITE); 
     mlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     mlp.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
     m.setTextSize(10); 

     flp.addRule(RelativeLayout.LEFT_OF, s.getId()); 
     flp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     flp.addRule(RelativeLayout.CENTER_VERTICAL); 

     s.setText("S"); 
     s.setTextSize(10); 
     s.setBackgroundColor(Color.rgb(192, 48, 46)); 
     s.setTextColor(Color.WHITE); 
     slp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     slp.addRule(RelativeLayout.ALIGN_PARENT_TOP); 

     r1.addView(t, tlp); 
     r1.addView(m, mlp); 
     r2.addView(f, flp); 
     r2.addView(s, slp); 

     r1.setBackgroundColor(Color.rgb(233, 242, 251)); 
     r2.setBackgroundColor(Color.rgb(233, 242, 251)); 

     r1LP.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
     r2LP.addRule(RelativeLayout.BELOW, r1.getId()); 

     this.addView(r1, r1LP); 
     this.addView(r2, r2LP); 

     this.setLayoutParams(wrapLP); 

     //this.addView(wrap); 

     Log.i(TAG, "ChannelController constructor was called"); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     // TODO Auto-generated method stub 
     //super.onLayout(changed, l, t, r, b); 

    } 

} 

क्या मैं onLayout विधि ओवरराइड में क्या करना चाहिए?

+0

संबंधित (जो, मुझे लगता है, वास्तव में आपके मामला है): http://stackoverflow.com/questions/6843138/viewgroup-onlayout-problem –

उत्तर

36

onLayout में आप इस ViewGroup के प्रत्येक बच्चे पर layout विधि कॉल और उनके लिए इच्छित स्थान (अपेक्षाकृत माता-पिता के लिए) प्रदान करने के लिए की जरूरत है। आप यह पता लगाने के लिए FrameLayout (ViewGroup के सबसे सरल उपखंडों में से एक) के स्रोत कोड की जांच कर सकते हैं।

हालांकि, अगर आप किसी भी "विशेष" नये नोट्स की जरूरत नहीं है, आप अन्य विकल्प हैं:

  • बजाय ViewGroup (FrameLayout उदाहरण के लिए) के कुछ अन्य उपवर्ग बढ़ाएँ
  • उपयोग LayoutInflater अगर आप सिर्फ जरूरत है वास्तव में XML में के रूप में देखने के लिए अपने नियंत्रण
+0

हाय दिमित्री Zaitsev .. मैं सैम का सामना कर रहा हूँ ई समस्या और अपने समाधान का उपयोग करने के बाद भी हल करने में सक्षम नहीं है। मैंने इस लिंक में अपनी समस्या निर्दिष्ट की है: http://stackoverflow.com/questions/19311549/after-inflating-and-assigning-a-layout-to-view-the-elements-inside-layout-not-s/19311818 ? noredirect = 1 # 19,311,818। कृपया – Sushil

+0

सहायता करें यदि आप 'व्यू ग्रुप' का विस्तार कर रहे हैं, तो कृपया एक एक्सएमएल लेआउट कहां बढ़ाएं? –

+1

@anoniim अपने कस्टम 'व्यू ग्रुप' –

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