#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. Потрясающее спасибо. Я скоро буду ездить на работу, поэтому, возможно, не смогу протестировать это с моей стороны до завтра, но тогда продолжу. Спасибо