#android #android-relativelayout
#Android #android-relativelayout
Вопрос:
Почему мой относительный макет занимает всю ширину экрана
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f00"
>
<Button
android:id="@ id/Button01"
android:text="Press Here"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button
android:id="@ id/Button02"
android:text="02"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</RelativeLayout>
Я указал относительный макет на «wrap_content», тогда почему он занимает все пространство экрана. Вывод такой же, даже если я говорю android:layout_width=»fill_parent».
Просветите меня, пожалуйста!
РЕДАКТИРОВАТЬ: я думаю, что я не очень четко сформулировал свой вопрос ранее. Извиняюсь за это. Когда у меня есть 2 дочерних представления в относительном макете, и один из них выровнен по левому краю с родительским, а другой выровнен по правому краю, а относительная ширина макетов равна WRAP_CONTENT, тогда я ожидал, что ширина макетов будет просто суммой ширины 2 кнопок (разве это не то, что означает WRAP_CONTENT ??). Я знаю, что есть другие способы достижения пользовательского интерфейса, который я ищу, но я просто пытаюсь правильно понять эти относительные теги макета.
РЕДАКТИРОВАТЬ 2: я немного поэкспериментировал, и похоже, что если мы используем Layout_AlighParentRight с родительской шириной в качестве WRAP_CONTENT, то для вычисления используется верхняя ширина макета (как указано в нескольких ответах ниже). Но мы используем только Layout_alignParentLeft, тогда он работает должным образом, и ширина макета не распространяется на весь экран. Спасибо за помощь, ребята!
Ответ №1:
В других ответах правильно указано, что когда для ширины вашего относительного макета установлено значение wrap_content
, а его дочерние элементы выровнены как по левому, так и по правому краю, относительный макет занимает ширину своего родительского элемента — в данном случае всего экрана. Однако, если бы оба дочерних элемента были выровнены по одной стороне, относительный макет был бы таким же широким, как самый широкий дочерний элемент.
Теперь, если вы хотите, чтобы две кнопки располагались рядом друг с другом, а относительный макет был таким же широким, как сумма ширин кнопок, необходим немного другой подход. Вместо позиционирования обеих кнопок относительно родительской, сделайте это только с одной кнопкой (например, первой). Допустим, его расположение остается неизменным ( android:layout_alignParentRight="true"
). Теперь кнопка перемещается вправо, поэтому вторая кнопка, чтобы быть расположенной рядом с ней, должна быть выровнена по левой стороне первой кнопки. Таким образом, мы просто добавляем android:layout_toLeftOf="@id/Button01"
(и удаляем android:layout_alignParentLeft="true"
часть).
Для получения дополнительной информации я предлагаю вам ознакомиться с очень удобным руководством по относительным макетам.
Комментарии:
1. Спасибо за ответ, Эрнеста! теперь это немного прояснило ситуацию. Но я все еще немного поражен тем, почему относительные макеты обращают внимание на ширину своего родителя, если его дочерние элементы выровнены как по левому, так и по правому краям. И привет, поздравляю с достижением century по репутации!!
2. Спасибо :). Подумайте об этом так:
wrap_content
средства должны быть такими же широкими, как пространство, занимаемое дочерними элементами. Теперь, если вы возьмете дочерний элемент и скажетеalignParentRight
, он должен находиться справа от своего родителя. Но насколько широк родительский элемент? Ну, так же широко, как пространство, занимаемое дочерними элементами. Другими словами, родительский элемент оставляет решение о его ширине своим дочерним элементам. И дочерние элементы не ограничены своим родителем, поэтому они идут до самого конца, который является родительским контейнером.3. Привет, у кого-нибудь есть идея для этого подхода в xamarin forms xaml?
Ответ №2:
потому что у вас есть
android:layout_alignParentLeft="true"
ширина объекта и
android:layout_alignParentRight="true"
ширина другого объекта, затем макет распространяется на обе стороны, предоставляя вам макет во всю ширину.
Но когда вы используете Layout_alignParentXXXXX и вводите родительский WRAP_CONTENT , это заставляет дочерних элементов переходить к верхнему макету с определенной шириной.
Комментарии:
1. Спасибо за ответ, но мне это не очень понятно. Вы хотите сказать, что если мы используем Layout_alignParentXXXX, а родительская ширина равна WRAP_CONTENT, то для вычисления используется ширина верхнего макета (родительского родителя)?? это правда?
2. мой опыт подсказал мне это, но вы можете попробовать, добавив еще один верхний LinearLayout с шириной, например, 50dip, и посмотреть результат 🙂
3. Я немного поэкспериментировал, и похоже, что если мы используем Layout_AlighParentRight с родительской шириной в качестве WRAP_CONTENT, то для вычисления используется верхняя ширина макета (как вы указали). Но мы используем только Layout_alignParentLeft, тогда он работает должным образом, и ширина макета не распространяется на весь экран. Спасибо за помощь, Кирога!
Ответ №3:
Эта строка заставляет кнопку «Нажать здесь» ( Button01
) выровняться по правому краю:
android:layout_alignParentRight="true"
Это заставляет ваш макет заполнять родительский по ширине.
Ответ №4:
Еще одна проблема, с которой вы можете столкнуться, заключается в том, что если вы установите для своих 2 дочерних элементов значение «выровнять родительское право» «wrap_content», а для вашего относительного макета значение «wrap_content», и этот относительный макет содержится в полноэкранном линейном представлении, ваш относительный макет будет занимать всю ширину линейного представления.
Если вы сделаете это с помощью обоих «выровнять родительский левый», относительный макет останется слева, а его ширина действительно будет «переносить содержимое». Но поведение отличается для «выравнивания родительского права», это немного странно.
Обходной путь:
Чтобы решить эту проблему (мне пришлось выровнять одного из дочерних элементов вправо), я фактически установил для 2 дочерних элементов значение «выровнять родительский левый» и поиграл с заполнением дочерних элементов, чтобы расположить одного из дочерних элементов в правом верхнем углу. Это грязный обходной путь, но единственный, который я нашел на данный момент.
Возможные более чистые решения:
Другим трюком было бы поместить 2 LinearLayout внутри FrameLayout, затем поместить своих реальных дочерних элементов в каждый LinearLayout и поиграть с серьезностью этих LinearLayout, чтобы расположить дочерние элементы в правильном положении.
- RelativeLayout
- LinearLayout
- Дочерний элемент 1 (wrap_content)
- LinearLayout (gravity: вверху справа)
- Дочерний элемент 2 (wrap_content)
- LinearLayout