2011-12-27 23 views
31
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/messageLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:id="@+id/messageSender" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginRight="10dp" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="5dp" 
     android:layout_marginBottom="5dp"/> 

    <TextView 
     android:id="@+id/messageSenderName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/messageSender" 
     android:ellipsize="end" 
     android:maxLines="1" 
     android:singleLine="false" 
     android:textColor="@color/list_text_color" 
     android:textSize="16dp" 
     android:layout_marginTop="5dp" /> 

    <TextView 
     android:id="@+id/messageContent" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/messageSender" 
     android:layout_below="@id/messageSenderName" 
     android:ellipsize="end" 
     android:maxLines="1" 
     android:singleLine="false" 
     android:textColor="@color/codeFont" 
     android:textSize="13dp"/> 
</RelativeLayout> 

Nel mio layout ho un problema. Quando ho impostato marginTop="5dp" va bene, ma quando uso marginBottom non succede nulla nel mio layout. Anche quando imposto il padding in RelativeLayout non funziona neanche. Qual è il problema qui? Potresti darmi qualche soluzione?perché marginBottom non funziona?

risposta

83

marginBottom non ha alcun effetto se si imposta android:layout_height="wrap_content" per <RelativeLayout>, invece di impostare come match_parent e verificare.

+0

'fill_parent' è deprecato a partire dal livello API 8 e sostituito da' match_parent'. –

+3

@RosePerrone si lo so, ma penso che questa risposta sia stata postata 2 anni indietro;) –

+0

semplicemente aggiorna la tua risposta –

17

Si tratta semplicemente di un bug dello <RelativeLayout>, quindi è possibile provare a racchiudere il RelativeLayout all'interno di uno <LinearLayout> e impostare il margine lì.

+1

basta modificare il relativo per un lineare se è possibile. – Campino

9

Forse è possibile impostare android:paddingBottom="" di <RelativeLayout> per ottenere lo stesso effetto.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. – Naveen

+0

@Naveen Non lo so :) –

+1

Questo è un lavoro accettabile in giro per un incomprensibile altrimenti incomprensibile. – Moritz

13

Non sono sicuro in quale revisione di Android si stia verificando questo problema. Ho guardato RelativeLayout in Android 4.2.2 (https://android.googlesource.com/platform/frameworks/base/+/android-4.2.2_r1.1/core/java/android/widget/RelativeLayout.java) e credo che ci sia un bug in onMeasure.

In linee 486 a 488, abbiamo seguente codice:

if (isWrapContentHeight) { 
    height = Math.max(height, params.mBottom); 
} 

A mio parere, quanto sopra dovrebbe leggere:

if (isWrapContentHeight) { 
    height = Math.max(height, params.mBottom + params.bottomMargin); 
} 

con Android: layout_height = "wrap_content", RelativeLayout non lo fa compaiono tenendo conto del fondo inferiore dell'ultima vista verticale.

Vi suggerisco di provare uno dei seguenti modi:

*) Aggiungere una vista fittizia che sarà il punto di vista molto ultima verticalmente disposti, e garantire che essa ha l'attributo android: layout_below. Si noti che la vista fittizia non ha un margine inferiore, è lì in modo che RelativeLayout consideri il margine inferiore di viste disposto sopra di esso. Per il vostro caso, la visualizzazione manichino sarebbe simile a questa:

<View 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_below="@id/messageSender" 
/> 

*) Come altri hanno detto, ottenere lo stesso effetto in altri modi, come ad esempio Imbottitura.

*) Una soluzione non-così banale è portare in RelativeLayout, le sue definizioni di stile piattaforma e classi di gestione Pool nel tuo progetto, eseguire la correzione di bug che ho citato sopra e utilizzare questo ovunque si usa normalmente RelativeLayout.

*) aprire un bug con Google

Spero che questo aiuti.

+0

Questo problema è stato risolto nelle versioni più recenti di 'RelativeLayout', ma ora dipende dalla versione di SDK di destinazione che si sta utilizzando. In 'Android 5.1.1', viene eseguito controllando la versione in questo modo:' if (targetSdkVersion

-3

Funziona se si utilizza android:layout_marginBottom with android:layout_alignParentBottom="true".

Ad esempio:

android:layout_alignParentBottom="true" 
android:layout_marginBottom="50dp"> 
+0

No, no, il problema è il layout_height = "wrap_content" – Miquel

1

Assicurarsi che il layout_height del contenitore principale è impostato su match_parent invece di wrap_content.