2011-11-17 13 views
18

Sto provando a nidificare uno RelativeLayout all'interno di un LinearLayout e assegnare allo RelativeLayout un margine che ne distanzia i bordi dai bordi dello LinearLayout. Finora ho questo:Layout relativo ignorato setMargin()

LayoutInflater.from(context).inflate(R.layout.conversation_view_layout, this, true); 

this.setLayoutParams(new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
int tbm = AllConversationsActivity.topAndBottomMargin; 
int lrm = AllConversationsActivity.leftAndRightMargin; 
((MarginLayoutParams) this.getLayoutParams()).setMargins(lrm, tbm, lrm, tbm); 
this.requestLayout(); 

Il che, se sto leggendo l'API correttamente, dovrebbe impostare il margine della RelativeLayout ai numeri specificati. Non lo fa affatto, ma invece sembra semplicemente ignorare il setMargins() interamente.

Inoltre, ecco il mio xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

<ImageView 
    android:id="@+id/conversation_picture" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true"/> 

<TextView 
    android:id="@+id/conversation_person" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@id/conversation_picture" 
    android:singleLine="true" 
    android:ellipsize="marquee"/> 

<TextView 
    android:id="@+id/conversation_length" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentRight="true"/> 

<TextView 
    android:id="@+id/conversation_first_line" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_below="@id/conversation_picture" 
    android:layout_alignParentLeft="true" 
    android:singleLine="true" 
    android:ellipsize="end"/> 

<TextView 
    android:id="@+id/conversation_last_time" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_below="@id/conversation_first_line" 
    android:layout_alignParentLeft="true" 
    android:singleLine="true" 
    android:ellipsize="marquee"/> 

ho un piccolo sospetto che questi punti di vista stanno costringendo le RelativeLayout bordi ai bordi genitori quando fanno le loro chiamate di allineamento. Qualcuno sa cosa deve essere fatto per ottenere questi margini da impostare? O forse c'è un modo migliore per farlo completamente? Apprezzato.

risposta

32

Modifica:

Si utilizza MarginLayoutParams invece di LinearLayoutParams. NOTA: se si imposta LayoutParams su un contenitore di layout, sarà necessario utilizzare il tipo del genitore.

Quindi, se si dispone di un LinearLayout che contiene un RelativeLayout, è necessario impostare LinearLayout.LayoutParams su RelativeLayout.

// NOT WORKING: LinearLayout.LayoutParams params = (LayoutParams) getLayoutParams(); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
int tbm = AllConversationsActivity.topAndBottomMargin; 
int lrm = AllConversationsActivity.leftAndRightMargin; 
params.setMargins(tbm, lrm, tbm, lrm); 
setLayoutParams(params); 
+0

Se questo fosse il problema, avrebbe ricevuto un'eccezione di classe. MarginLayoutParams sono una super classe di LinearLayout.LayoutParams, RelativeLayout.LayoutParams e così via. Inoltre ciò che setLayoutParams() fa in realtà è di mantenere i parametri in un campo membro e chiamare requestLayout() in modo che solo una di queste chiamate debba essere terminata (sia requestLayout() o setLayoutParams() ma non i due insieme) – asenovm

+2

Entreco, hai attivato per essere esattamente giusto, è stato perché stavo creando il proprietario sbagliato dei parametri, ma l'implementazione che hai inserito era leggermente sbagliata. Ecco il codice che ha finito per lavorare: 'LinearLayout.LayoutParams params = new LinearLayout.LayoutParams ( \t \t \t \t LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); \t \t int tbm = AllConversationsActivity.topAndBottomMargin; \t \t int lrm = AllConversationsActivity.leftAndRightMargin; \t \t params.setMargins (tbm, lrm, tbm, lrm); \t \t setLayoutParams (parametri); \t \t requestLayout(); ' Grazie per il vostro aiuto! – blaineh

+0

questo non funziona per me. Ho provato questo nel mio costruttore di LinearLayout esteso. I margini non vengono visualizzati a prescindere dalle dimensioni che fornisco. Cosa potrebbe esserci di sbagliato? – faizal

Problemi correlati