Фиксированная пропорция макета на экране

1

В моем приложении у меня есть 2 линейных макета: один сверху, другой снизу.

Мне бы хотелось, чтобы все, что находится внутри этих макетов, макет верхней части занимал 60% высоты экрана, а макет нижней - 40%. Вот мой код XML:

   <?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:layout_weight="1.0" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.6"
        android:orientation="vertical" 
         android:id="@+id/layout_top">
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_weight="0.4" 
        android:id="@+id/layout_bottom">
    </LinearLayout>

</LinearLayout>

Когда эти макеты пусты, нет проблем, они имеют хорошую пропорцию.

Проблема заключается в том, что если я добавлю небольшой вид списка в верхний макет, например, тогда макет примет размер списка и не сохранит пропорцию 60/40%.

Я бы хотел, чтобы даже если мой список просмотра был маленьким (например, всего 3 элемента), макет сохранил его на 60% и поэтому оставил некоторое свободное пространство под моим списком.

Я пытался изменить android:layout_height на match_parent но это ничего не меняет.

  • 0
    Ваш макет, кажется, в порядке. Можете ли вы показать, как вы добавляете небольшой список в верхнем макете.
Теги:
view
layout
android-layout
percentage
android-view
android-layout-weight
weight

4 ответа

6
Лучший ответ

Попробуйте использовать этот макет, он работает для меня

<?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:layout_weight="1.0" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="6"
        android:orientation="vertical" 
         android:id="@+id/layout_top"
         android:background="#FF0000">
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:orientation="vertical"
        android:layout_weight="4" 
        android:id="@+id/layout_bottom"
        android:background="#FF00FF">
    </LinearLayout>

</LinearLayout>

Фокус в том, чтобы установить layout_height="0dip" вместо wrap_content в портретном режиме, а layout_with="0dip" вместо wrap_content в ландшафтном режиме для этого вы можете использовать папку layout-land.

  • 0
    Работает, большое спасибо :)!
1

layout_weight определяет дополнительное пространство в layoutfot view. вы должны сначала попытаться измерить свой экран:

Display display = ((WindowManager) 
  getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
int width = display.getHeight();

а затем делать некоторые вычисления, такие как ширина * 0,6 и 0,4, таким образом, ваш макет всегда будет иметь отношение 60 40.

Надеюсь это поможет

0

Просто в макете вашего родителя замените android:layout_weight="1.0" на android:weightSum="1.0"

Это работает, устанавливая весовую массу родительского макета и веса макетов детей. Вес детей должен быть равен весовой сумме родителя. Взгляните на это http://blog.stylingandroid.com/archives/312

0

попробуйте layout_height = 0dp в обоих дочерних LinearLayouts. Это происходит потому, что у вас есть wrap_content который, вероятно, layout_weight эффект layout_weight.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню