Макет, одна группа просмотра занимает 60% высоты, а другая заполняет остальное

#android #android-layout #layout #xamarin.android #android-layout-weight

#Android #android-layout #макет #xamarin.android #android-layout-weight

Вопрос:

Я немного отскочил и не смог найти решение, соответствующее тому, что я пытаюсь сделать.
У меня есть 2 RelativeLayouts внутри LinearLayout.
Я бы хотел, чтобы первый RelativeLayout занимал 60% экрана.
Я бы хотел, чтобы второй макет занимал оставшуюся часть экрана.

Я использую веса, но пытаюсь понять, есть ли способ избежать использования дополнительного веса во втором RelativeLayout .
Причина этого в том, что пользователь может одним нажатием кнопки скрыть первый макет.

В коде я делаю это, устанавливая видимость первого RelativeLayout на «Gone».
Проблема в том, что если у меня установлен вес .6 и .4 и сумма 1, когда для первого установлено значение gone, второй правильно перемещается вверх, но его высота не увеличивается, потому что она была установлена на 40%.

В идеале я мог бы настроить его так, чтобы он заполнял оставшееся пространство на экране, и поэтому, когда первая скрыта, она теперь будет занимать все 100% экрана.
Возможно ли это или мне нужно сделать больше программно, когда я скрываю первый вид, чтобы увеличить допустимую высоту второго вида?
Надеюсь, это имеет смысл, если нет, дайте мне знать, и я постараюсь уточнить дальше.

Я удалил часть содержимого RelativeLayouts для простоты, а также некоторые идентификаторы.

Код ниже:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:breadCrumbNavigationLayout="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@ id/linearlayout1"
android:focusable="true"
android:focusableInTouchMode="true"
android:weightSum="1">
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:id="@ id/relativeLayout1"
    android:layout_weight="0.6">
    <FrameLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@ id/frame1" />
    <ProgressBar
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:id="@ id/progress"
        android:indeterminateOnly="true"
        android:keepScreenOn="true"
        android:visibility="gone" />
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@ id/relative2">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:textSize="16dp"
            android:gravity="center_horizontal"
            android:layout_below="@ id/relativeLayout1" />
        <ListView
            android:id="@ id/list"
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:dividerHeight="1dp" />
    </RelativeLayout>
</LinearLayout>
  

Ответ №1:

Для достижения этой цели вы можете использовать относительную процентную компоновку библиотеки поддержки Android. Процентное относительное расположение

импортируйте библиотеку поддержки в процентах, добавив следующую строку в свой build.gradle (уровень приложения),

 compile 'com.android.support:percent:24.2.1'
  

И ваш XML-файл будет,

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:breadCrumbNavigationLayout="http://schemas.android.com/apk/res-auto"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/white"
   android:id="@ id/linearlayout1"
   android:focusable="true"
   android:focusableInTouchMode="true"
   android:weightSum="1">

  <android.support.percent.PercentRelativeLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent">

<RelativeLayout
android:layout_height="0dp"
android:layout_width="match_parent"
app:layout_heightPercent="60%"
android:id="@ id/relativeLayout1"
>
<FrameLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@ id/frame1" />
<ProgressBar
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:id="@ id/progress"
    android:indeterminateOnly="true"
    android:keepScreenOn="true"
    android:visibility="gone" />
</RelativeLayout>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@ id/relativeLayout1"
    android:id="@ id/relative2">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="16dp"
        android:gravity="center_horizontal"
        android:layout_below="@ id/relativeLayout1" />
    <ListView
        android:id="@ id/list"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:dividerHeight="1dp" />
</RelativeLayout>
</android.support.percent.PercentRelativeLayout>

</LinearLayout>
  

Как только вы установите,

 relativeLayout1.setVisibility(View.GONE);
  

вы можете видеть, что относительный макет 2 будет занимать все родительское пространство.

Я надеюсь, что это вам поможет. Всего наилучшего.

Комментарии:

1. Вы можете установить высоту первого макета на 60%, а второй макет ниже первого макета, а высота второго макета равна match_parent . Когда вы скроете первый макет, он займет весь макет.

2. Я могу разобраться в этом, но похоже, что для закрытия экрана все еще требуется несколько процентов? Возможно ли установить процент только для одного содержимого, а остальное заполнить другим?

3. ДА. Я готовлю рабочий код. Я обновлю его. Пожалуйста, подождите.

4. Потрясающее спасибо. Я скоро буду ездить на работу, поэтому, возможно, не смогу протестировать это с моей стороны до завтра, но тогда продолжу. Спасибо