Следующие два файла макета дают разные результаты:Asymmetric RelativeLayout в Android
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<View
android:id="@+id/box"
android:background="#ff0000"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/next_box" />
<View
android:id="@+id/next_box"
android:background="#0000ff"
android:layout_width="60dp"
android:layout_alignParentRight="true"
android:layout_height="30dp"
/>
</RelativeLayout>
</LinearLayout>
Результат:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<View
android:id="@+id/box"
android:background="#ff0000"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
/>
<View
android:id="@+id/next_box"
android:background="#0000ff"
android:layout_width="60dp"
android:layout_alignParentRight="true"
android:layout_height="30dp"
android:layout_toRightOf="@+id/box"
/>
</RelativeLayout>
</LinearLayout>
Результат:
Обе макеты пытаются описать те же ограничения. А именно, красный прямоугольник должен касаться левого края родителя, синий прямоугольник должен касаться правого края родителя, и они должны появляться рядом друг с другом по горизонтали. Единственное различие заключается в том, задаете ли вы ограничение «рядом» с красным прямоугольником или синим прямоугольником. Я выяснил причину, связанную с порядком разрешения измерения, созданным путем формирования графика зависимостей ограничений, но я только вычислил его, прочитав исходный код RelativeLayout, и я не смог найти никакой документации/заметок относительно этого поведения. Поскольку RelativeLayout должен быть обычно используемым компонентом компоновки, есть ли более интуитивное объяснение этого поведения или есть какая-то часть документации, которую я пропускаю?
Вы установите 'layout_width' attri bute или first 'View' до 0. В первом случае' RelativeLayout' явно дает ему оставшуюся ширину, так как вы определили ее выравнивания влево и вправо. Во втором случае нет правильного выравнивания, поэтому это макет слева с шириной 0, а другой 'View' принимает всю доступную ширину, поскольку она явно определена для выравнивания с правой границей первого' View '. – corsair992