Почему мой относительный макет занимает всю ширину экрана - PullRequest
7 голосов
/ 08 октября 2011

Почему мой относительный макет занимает всю ширину экрана

<?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". Enlighten

Просвети меня, пожалуйста!

РЕДАКТИРОВАТЬ: Я думаю, что я не очень ясно с моим вопросом ранее. Извиняюсь за это. Когда у меня есть 2 дочерних вида в относительном макете, и один из них выровнен по левому краю к родителю, а другой выровнен по правому краю, а относительная ширина макетов равна WRAP_CONTENT, тогда я ожидал, что ширина макетов будет просто суммой ширины 2 кнопок (не вот что значит WRAP_CONTENT ??). Я знаю, что есть другие способы достижения нужного интерфейса, но я просто пытаюсь правильно понять эти относительные теги компоновки.

РЕДАКТИРОВАТЬ 2: Я немного поэкспериментировал, и похоже, что если мы используем Layout_AlighParentRight с шириной его родителя как WRAP_CONTENT, то для вычисления используется верхняя ширина макета (как показано в нескольких ответах, указанных ниже). Но мы используем только Layout_alignParentLeft, тогда он работает как положено, и ширина макета не распространяется на весь экран. Спасибо за помощь, ребята!

Ответы [ 4 ]

13 голосов
/ 08 октября 2011

В других ответах правильно указано, что когда ширина вашего относительного макета установлена ​​на wrap_content, а его дочерние элементы выровнены по левому и правому краям, относительный макет принимает ширину своего родителя - в этом случае весьэкран.Однако, если оба дочерних элемента были выровнены в одну сторону, относительный макет будет таким же широким, как и самый широкий дочерний элемент.

Теперь, если вы хотите, чтобы две кнопки были расположены рядом друг с другом, а относительный макет -быть равным сумме ширины кнопок, требуется немного другой подход.Вместо того, чтобы расположить обе кнопки относительно родителя, сделайте это только с одной кнопкой (например, с первой).Допустим, его позиционирование осталось без изменений (android:layout_alignParentRight="true").Теперь кнопка перемещается вправо, поэтому вторая кнопка, чтобы быть рядом с ней, должна быть выровнена по левой стороне первой кнопки.Таким образом, мы просто добавляем android:layout_toLeftOf="@id/Button01" (и удаляем часть android:layout_alignParentLeft="true").

Более подробно я предлагаю вам ознакомиться с очень дружелюбным учебником по относительным макетам .

3 голосов
/ 08 октября 2011

, поскольку у вас есть

        android:layout_alignParentLeft="true" 

ширина объекта и

        android:layout_alignParentRight="true" 

ширина другого объекта, тогда макет распространяется на обе стороны, давая вам макет полной ширины.

Но когда вы используете Layout_alignParentXXXXX и вставляете родительский WRAP_CONTENT, это заставляет детей переходить на верхний макет с определенной шириной.

1 голос
/ 08 октября 2011

Эта строка приводит к выравниванию кнопки «Нажмите здесь» (Button01) вправо:

android:layout_alignParentRight="true" 

Это позволяет макету заполнить родительский элемент по ширине.

0 голосов
/ 08 августа 2014

Другая проблема, с которой вы можете столкнуться, заключается в том, что если вы установите для 2-х детей «выравнивание родительского права» + «wrap_content», а относительный макет - «wrap_content», и этот относительный макет будет содержаться в полноэкранном режиме LinearLayout вашего относительного макета будет занимать всю ширину LinearLayout.

Если вы сделаете это с обоими «выравнивать родительский левый», относительный макет останется слева, а его ширина будет действительно «содержимым переноса». Но поведение «выровнять родительское право» отличается, это немного странно.

Обход:

Чтобы решить эту проблему (мне пришлось выровнять одного из дочерних элементов вправо), я фактически установил 2 дочерних элемента для «выравнивания родительского элемента влево» и поиграл с отступами дочерних элементов, чтобы один из дочерних элементов был расположен сверху правый угол. Это грязный обходной путь, но пока я нашел только один.

Возможные более чистые решения:

Другой трюк - поместить 2 LinearLayout в FrameLayout, затем поместить ваших настоящих детей в каждый LinearLayout и поиграть с гравитацией этих LinearLayout, чтобы расположить детей в правильном положении.

  • RelativeLayout
    • LinearLayout
      • Ребенок 1 (wrap_content)
    • LinearLayout (гравитация: вверху справа)
      • Ребенок 2 (wrap_content)
...