2013-09-03 8 views
5

Ho una personalizzazione View. Nel costruttore per la vista, creo e aggiungo due sottoview. Tuttavia, l'utilizzo di LayoutParams.addRule() sta causando alcuni problemi. Regole quali CENTER_HORIZONTAL lavoro, ma quando provo ad usare ABOVE, la visualizzazione secondaria finisce con un'altezza di 0.L'aggiunta programmatica di SOPRA a LayoutParams causa l'altezza di visualizzazione da 0

Ecco il codice nel mio costruttore:

setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 


    mLayoutParams = new LayoutParams(width, height); 
    mLayoutParams.leftMargin = left; 
    mLayoutParams.topMargin = top; 

    mImage = new ImageView(getContext()); 
    mImage.setImageDrawable(getResources().getDrawable(R.drawable.my_image_drawable)); 
    mImage.setScaleType(ScaleType.FIT_XY); 
    mImage.setId(R.id.my_image_id); 
    addView(mImage, mLayoutParams); 

    mText = new TextView(getContext()); 
    mText.setText(R.string.my_text); 
    mText.setId(R.id.my_text_id); 
    LayoutParams textParams = new LayoutParams(200, 40); 
    // textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works 
    textParams.addRule(ABOVE, mImage.getId()); //Doesn't work 

    addView(mText, textParams); 

Se ispezionare la vista su un emulatore con Device Monitor, posso vedere che il layout_height del testo è 40, ma i parametri in alto, in basso e in altezza sono tutti 0. measuredHeight sembra essere uguale alla larghezza dello schermo.

  1. Sto facendo qualcosa di sbagliato con l'aggiunta delle regole?
  2. C'è un posto migliore per aggiungere le regole? Qualcosa deve succedere prima?
  3. Altre eventuali alternative? Rendere il TextView un'altezza di FILL_PARENT, gravità BOTTOM e impostare il margine inferiore all'altezza dell'immagine funziona, ma ho bisogno di essere in grado di aggiungere un'altra vista sopra il testo, e questo non funzionerà per quello.
+0

Prova ad aggiungere una regola per il tuo 'Immagine' da' Sotto' il tuo 'TextView'. Quando le cose vengono aggiunte a un 'RelativeLayout' vengono aggiunte in alto a sinistra se non diversamente specificato. Penso che quello che potrebbe accadere è che non c'è posto sopra il tuo 'Image' per' TextView' per andare – codeMagic

+0

Ah, scusa, mi è mancato nel mio codice. 'mLayoutParams' ha una sinistra, una cima, una larghezza e un'altezza definite. Non dovrebbe essere sufficiente per sapere dove andare? @codeMagic, ho aggiornato il codice. – karl

+0

L'aggiunta di 'ALIGN_BOTTOM' a' mImage' non cambia nulla. Se lo cambio a 'BELOW', invece, ottengo un errore di dipendenza circolare. Voglio che il testo sia sopra l'immagine e l'immagine abbia una posizione fissa. – karl

risposta

1

dove nel codice si controlla l'altezza? Se si trova da qualche parte all'interno di onCreate o onCreateView, non otterrai alcuna informazione. Il layout è un processo a due passaggi e in questi due metodi i due passaggi non sono completi.

Potrebbe essere necessario per ottenere l'altezza in quei metodi utilizzando il metodo ".post" come questo:

 myView.post(new Runnable() { 
     @Override 
      public void run() { 
       int height = myView.getHeight(); 
      } 
     }); 

L'eseguibile rende eseguito sul thread dell'interfaccia utente, ma viene invocato dopo che entrambi i passaggi, il misurare passare e il passaggio di layout, hanno completato. Quindi, provare a impostare una regola basata su un centro orizzontale senza prima sapere che le misurazioni falliranno.

+0

I parametri di larghezza e altezza utilizzati per l'immagine sono passati da qualche parte altro, e ho verificato che non sono zero e corretti. – karl

0
// try this 
mText = new TextView(getContext()); 
mText.setText(R.string.my_text); 
mText.setId(R.id.my_text_id); 
RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(200, 40); 
// textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works 
textParams.addRule(RelativeLayout.ABOVE, mImage.getId()); //Doesn't work 

addView(mText, textParams); 
Problemi correlati