2013-07-07 6 views
23

Quando si estende una classe Android ViewGroup, qual è lo scopo della sostituzione di onLayout()? Sto facendo un controllo personalizzato su Android ma per qualche motivo il contenuto (oggetti bambino View) non viene visualizzato. Il mio approccio era di estendere la classe ViewGroup, aggiungendo child-Views tramite il metodo addView() di ViewGroup. Poi, nella mia attività principale, ho il seguente codice:ViewGroup Android: cosa devo fare in overLide di onLayout()?

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

ChannelController è il nome della mia classe personalizzata che estende ViewGroup. Devo fare qualcosa di sbagliato perché non viene mostrato nulla sullo schermo.

Comprendo che devo eseguire l'override e implementare il metodo onLayout(), ma con cosa? So che c'è un'intera pagina dedicata a questo sul sito dev.android, ma non mi è stato di grande aiuto, soprattutto perché sono un novellino credo. Qualsiasi intuizione sarebbe apprezzata.

Per riferimento, la mia estensione ViewGroup si presenta come di seguito:

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); 

    } 

} 

Che cosa devo fare nel metodo di sostituzione onLayout?

+0

correlati: http://stackoverflow.com/questions/6843138/viewgroup-onlayout-problem –

risposta

36

In onLayout è necessario chiamare il metodo layout su ogni figlio di questo ViewGroup e fornire la posizione desiderata (relativamente al padre) per loro. È possibile controllare il codice sorgente di FrameLayout (una delle sottoclassi più semplici di ViewGroup) per scoprire come funziona.

Anche se, se non hai bisogno di alcuna interfaccia grafica "speciale", avete altre opzioni:

  • Estendere gli altri un'altra sottoclasse di ViewGroup invece (FrameLayout per esempio)
  • Usa LayoutInflater se avete solo bisogno il vostro controllo a guardare esattamente come in XML (che, credo, è esattamente il tuo caso)
+0

Hi Dmitry Zaitsev .. io sto affrontando Sam Problema e incapace di risolvere anche dopo aver usato la tua soluzione. Ho specificato il mio problema in questo collegamento: 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. Si prega di aiutare – Sushil

+0

Dove si gonfia un layout XML, se si sta estendendo 'ViewGroup', per favore? –

+1

@anoniim all'interno del costruttore del tuo 'ViewGroup' personalizzato –