2016-04-28 1 views
0

Я хотел бы достичь следующую структуру:Android layout_weight путаница (три элемента, один должен расти, чтобы заполнить экран)

enter image description here

ListView LV1 должны обернуть его содержание и оставаться на вершине. LinearLayout LL3 должен обернуть свой контент и остаться внизу. ListView LV2 должен заполнить оставшийся экран.

Он работает нормально, пока LV2 имеет достаточно записей для заполнения экрана. Но когда LV2 содержит только, например, два или нулевые элементы, LL3 сдвигается вверх.

Что нужно изменить, чтобы LV2 всегда заполнял экран независимо от количества элементов в ListView и оставался LL3 внизу?

Вот мой макет:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <ListView 
     android:id="@+id/LV1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="@dimen/activity_vertical_margin" 
     android:layout_weight="0" 
     android:drawSelectorOnTop="true"></ListView> 

    <ListView 
     android:id="@+id/LV2" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_marginTop="@dimen/activity_vertical_margin" 
     android:layout_weight="1"></ListView> 


    <LinearLayout 
     android:id="@+id/LL3" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/button_cancel" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="@string/Button_Cancel" 

      /> 

     <Button 
      android:id="@+id/button_save" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="@string/Button_Save" 

      /> 

    </LinearLayout> 


</LinearLayout> 

ответ

2

Поскольку вы не можете сказать своему LL3 закрепиться на дне, вы должны изменить оберточной LinearLayout к RelativeLayout:

//pseudo code: 
<RelativeLayout> 
    <LV1 
     android:alignParentTop="true"/> 
    <LV2 
     android:layout_below="@+id/lv1" 
     android:layout_above="@+id/ll3"/> 
    <LL3 
     android:alignParentBottom="true"/> 
</RelativeLayout> 
+0

Отлично, спасибо большое! – user1195883

0

Лучший подход для использования RelativeLayout вместо LinearLayout. Но вы также можете добиться этого с помощью LinearLayout. Пожалуйста, смотрите пример кода ниже:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:weightSum="1"> 


<LinearLayout 
    android:id="@+id/LL1" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.1" 
    android:background="@android:color/highlighted_text_dark" 
    android:orientation="vertical"> 


</LinearLayout> 

<LinearLayout 
    android:id="@+id/LL2" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.8" 
    android:background="@android:color/suggestion_highlight_text" 
    android:orientation="vertical"> 


</LinearLayout> 

<LinearLayout 
    android:id="@+id/LL3" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.1" 
    android:background="@android:color/perms_costs_money" 
    android:orientation="vertical"> 


</LinearLayout> 

</LinearLayout> 

Выход этого кода будет:

enter image description here

Вы можете изменить weightSum и количество Чайлдс ВЫШЕСТОЯЩИХ LinearLayout в соответствии с вашими требованиями.

0

Используйте weightSum правильно, вы получите его

Проверить это

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="11" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <ListView 
     android:id="@+id/LV1" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_marginTop="@dimen/activity_vertical_margin" 
     android:layout_weight="2" 
     android:drawSelectorOnTop="true" /> 

    <View //this view is added just to separate listiview 
     android:id="@+id/view1" 
     android:layout_width="match_parent" 
     android:layout_height="2dp" 
     android:background="#000000" /> 

    <ListView 
     android:id="@+id/LV2" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_marginTop="@dimen/activity_vertical_margin" 
     android:layout_weight="8" /> 

    <View //this view is added just to separate listiview 
     android:id="@+id/view2" 
     android:layout_width="match_parent" 
     android:layout_height="2dp" 
     android:background="#000000" /> 

    <LinearLayout 
     android:id="@+id/LL3" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/button_cancel" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="@string/Button_Cancel" /> 

     <Button 
      android:id="@+id/button_save" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="@string/Button_Save" /> 
    </LinearLayout> 

</LinearLayout> 
+0

Вы проверили этот ответ? @ User1195883 –

+0

Большое спасибо за то, что нашли время, чтобы написать это. Ответ от @amy выше кажется намного проще и работает отлично. – user1195883

+0

Возможно, вы не можете получить правильный результат, как вы хотите, в RelativeLayout. –

0

если есть три текстовых поля и две из них декларируют вес 1, в то время как другой не дается никакого веса, то третье текстовое поле без веса не будет расти и будет занимать область, требуемую его содержимым. Остальные два будут одинаково расширяться, чтобы заполнить пространство, оставшееся после измерения всех трех полей. Если третьему полю присваивается вес 2 (вместо 0), тогда он объявляется более важным, чем другие, поэтому он получает половину всего оставшегося пространства, в то время как первые два разделяют остальные поровну.

Смежные вопросы