2011-11-17 15 views
18

Próbuję zagnieździć RelativeLayout wewnątrz LinearLayout i nadać RelativeLayout margines, który oddziela krawędzie od krawędzi LinearLayout. Do tej pory mam to:Układ względny ignorujący 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(); 

Co, jeśli mam poprawnie czyta API, należy ustawić margines RelativeLayout do określonych numerów. Wcale tak nie jest, ale zamiast tego po prostu ignoruje całkowicie setMargins().

Również tutaj moja 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"/> 

mam małe podejrzenia, że ​​te poglądy są zmuszając RelativeLayout krawędzi do krawędzi dominujących kiedy oni swoje połączenia wyrównania. Czy ktoś wie, co należy zrobić, aby ustawić te marginesy? A może istnieje lepszy sposób na zrobienie tego w całości? Doceniony.

Odpowiedz

32

EDIT:

Używasz MarginLayoutParams zamiast LinearLayoutParams. UWAGA: jeśli ustawisz opcję LayoutParams na kontenerze układu, będziesz musiał użyć typu rodzica.

Więc jeśli masz LinearLayout, który zawiera RelativeLayout, musisz ustawić LinearLayout.LayoutParams na 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

Gdyby to był problem, otrzymałby wyjątek od klasy. MarginLayoutParams to super klasa LinearLayout.LayoutParams, RelativeLayout.LayoutParams i tak dalej. Poza tym, co robi program setLayoutParams(), to utrzymywanie parametrów w polu składowym i wywoływanie requestLayout(), tak więc powinno zadziałać tylko jedno z tych wywołań (requestLayout() lub setLayoutParams(), ale nie oba razem) – asenovm

+2

Entreco, odwróciłeś się Dokładnie tak, ponieważ tworzyłem niewłaściwego właściciela paramów, ale implementacja, którą wprowadziłeś, była trochę zła. Oto kod, który zakończył się pracuje: '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 params.setMargins (tbm, lrm, tbm, lrm); \t setLayoutParams (params); \t \t requestLayout(); ' Dzięki za pomoc! – blaineh

+0

to nie działa dla mnie. Próbowałem tego w moim rozszerzonym konstruktorze LinearLayout. Marginesy nie pojawiają się wcale, bez względu na to, jakie wymiary dostarczam. Co może być nie tak? – faizal

Powiązane problemy