2013-04-13 9 views
9

Ich habe eine ListView, die mit RelativeLayouts gefüllt wird. Der Inhalt dieser RelativeLayouts kann sich ändern und somit ihre Höhe ändern. Auf jedem RelativeLayout habe ich eine kleine vertikale Leiste auf der linken Seite des Layouts, die der Höhe des Layouts entspricht.Kind von RelativeLayout füllt nicht die Höhe des RelativeLayout

Es ist ein ähnlicher Look this ->Link

Obwohl aus irgendeinem Grunde, das View-Objekt, das ich verwende nicht auf die Höhe des Layouts erweitert.

Was mache ich falsch?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/post" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/column_post_selector" 
android:orientation="horizontal" > 

<!-- Status bar (THIS ISN'T FILLING TO PARENTS' HEIGHT) --> 
<View 
    android:id="@+id/status" 
    android:layout_width="3dp" 
    android:layout_height="fill_parent" 
    android:layout_alignLeft="@id/post" 
    android:layout_marginBottom="2dp" 
    android:layout_marginTop="2dp" 
    android:background="#33B5E5" /> 

<ImageView 
    android:id="@+id/thumbnail" 
    android:layout_width="80dip" 
    android:layout_height="80dip" 
    android:layout_toRightOf="@id/status" 
    android:contentDescription="@string/empty" 
    android:layout_marginRight="5dp" 
    android:scaleType="fitStart" /> 

<!-- Title --> 

<TextView 
    android:id="@+id/title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@id/post" 
    android:layout_toRightOf="@id/thumbnail" 
    android:textColor="#ffffff" 
    android:textSize="14sp" 
    android:typeface="sans" /> 
<!-- Rightend Duration --> 

<TextView 
    android:id="@+id/date" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignTop="@id/title" 
    android:layout_marginRight="5dip" 
    android:gravity="right" 
    android:textColor="#10bcc9" 
    android:textSize="12sp" 
    android:textStyle="bold" /> 

</RelativeLayout> 

Antwort

-5

Sie wollen layout_alignParentTop="true" und layout_alignParentBottom="true"-status hinzuzufügen - dies stellt sicher, dass die Ansicht berührt sowohl die Ober- und Unterseite des post ‚s RelativeLayout.

+5

noch nicht funktioniert. Es ist extrem seltsam, wenn ich die Breite zum Füllen der Eltern einstellen, funktioniert es gut, aber die Höhe zu füllen Eltern scheint nicht zu reagieren. – vivatus

+0

Arbeite mich auch nicht. Aber in meinem Fall hat das Kind die gleiche Größe wie der Inhalt und wurde an den Elternboden angehängt. – neworld

+0

funktioniert nicht für mich entweder – Ali

0

Hatte das gleiche lästige Problem, das übrigens keinen Sinn macht. Was für mich am Ende arbeitete, war die android:layout_height in RelativeLayout Tag fill_parent wie diese

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    ... 

Hoffnung Veränderung dieses

3

hilft ich mit einem RelativeLayout in einem ScrollView hatte ein ähnliches Problem. According to the documentation gibt es einen Fehler in RelativeLayout (bis zu Version 17), die Fehler in der gemessenen Höhe verursachen, wenn es in scrollenden Container (wie ListView) hinzugefügt wird.

Um das Problem zu lösen, sollten Sie die Höhe programmatisch berechnen.

Sie könnten Ihre erweiterte Klasse erstellen und die Methode onMeasure überschreiben oder eine OnGlobalLayoutListener der übergeordneten Ansicht hinzufügen.

Ich wähle den zweiten Weg. Hier ist meine Lösung:

Example

findViewById(R.id.scroll_view).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     float topElementPosition = findViewById(R.id.top_element).getY(); 
     float bottomElementPosition = findViewById(R.id.bottom_element).getY(); 
     int bottomElementHeight = findViewById(R.id.bottom_element).getMeasuredHeight(); 
     int height = (int)(bottomElementPosition-topElementPosition+bottomElementHeight); 
     findViewById(R.id.view).setMinimumHeight(height); 
     findViewById(R.id.scroll_view).getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    } 
}); 
0

ich von Hand eingestellt Layout während onLayout für ungültig Ansicht behoben:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 

    int rootMarginRight = ((MarginLayoutParams)root.getLayoutParams()).rightMargin; 
    int paddingRight = root.getPaddingRight() + rootMarginRight; 

    //invalid view 
    actionsContainer.layout(
      right - actions.getWidth() - paddingRight, 
      0, 
      right - paddingRight, 
      getHeight() 
    ); 
} 
16

ich in den Zellen meines RecyclerView ein ähnliches Problem hatte, die eine hatte RelativeLayout als Root-Element.

Eine Problemumgehung für mich war das Umschließen eines zusätzlichen LinearLayout um das StammrelativLayout-Element.

So sieht man Karte wie folgt aus:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

     <RelativeLayout 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 
      <View 
       android:id="@+id/view_with_same_height_as_parent" 
       android:layout_width="10dp" 
       android:layout_height="fill_parent" 
       android:layout_alignParentBottom="true" 
       android:layout_alignParentTop="true"/> 
... 


    </RelativeLayout> 
</LinearLayout> 

Quelle: https://stackoverflow.com/a/28799251/3708094

+1

layout_alignParentBottom und layout_alignParentTop Parameter sind redundant, aber Ihr Rat ist sehr hilfreich. Vielen Dank! – Nar

+1

das ist die einzige Lösung, die für mich funktionierte. Interessanterweise funktionierte die Verwendung eines 'FrameLayout' nicht, aber die Verwendung des' LinearLayout' funktionierte. –

-1

Mein Problem war, die die folgende Zeile

android:fitsSystemWindows="true" <-- In the parent view 

entfernt wurde. Nachdem es hinzugefügt wurde, funktioniert es jetzt gut.

8

Wenn Ihr RelativeLayout in einem Scrollview ist, dann auf die Scroll benötigen Sie den fillViewPort param hinzuzufügen und setzen Sie ihn auf true

<ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fillViewport="true"> 
+0

Arbeitete für mich !! –

+0

Das war mein Problem! – rrbrambley