2017-02-22 8 views
0

Почему (черт возьми) не левый край RadioButton правильно выровнен с серым квадратным левым краем?Почему RelativeLayout не применяет layout_alignLeft с видом layout_centerInParent?

Это какое-то ограничение или ошибка RelativeLayout, препятствующая выравниванию вида к другому виду с центром в родительском?

Что было бы самым чистым обходным путем?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/holo_orange_dark"> 

    <View 
     android:id="@+id/square" 
     android:layout_width="200dip" 
     android:layout_height="200dp" 
     android:layout_centerInParent="true" 
     android:background="@android:color/darker_gray"/> 

    <RadioButton 
     android:layout_alignLeft="@id/square" 
     android:text="Radio button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@android:color/holo_blue_light"/> 

    <View 
     android:layout_width="300dp" 
     android:layout_height="20dp" 
     android:layout_centerInParent="true" 
     android:background="@android:color/holo_green_light" 
     /> 

</RelativeLayout> 

screenshot from AS 2.2.3 Layout Editor. Android API: 25

ответ

2

Вам нужно обернуть View и RadioButton в RelativeLayout.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@android:color/holo_orange_dark"> 

<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true"> 

    <View 
     android:id="@+id/square" 
     android:layout_width="200dip" 
     android:layout_height="200dp" 
     android:layout_centerInParent="true" 
     android:background="@android:color/darker_gray"/> 

    <RadioButton 
     android:layout_width="wrap_content" 
     android:layout_alignParentStart="true" 
     android:layout_height="wrap_content" 
     android:background="@android:color/holo_blue_light" 
     android:text="Radio button"/> 
</RelativeLayout> 

<View 
    android:layout_width="300dp" 
    android:layout_height="20dp" 
    android:layout_centerInParent="true" 
    android:background="@android:color/holo_green_light" 
    /> 

+0

Действительно, установка ширины RelativeLayout в качестве match_parent решает проблему выравнивания. Но, конечно, это также изменяет поведение этого RelativeLayout внутри его родителя. I * нужна * ширина RelativeLayout для wrap_content, поскольку она является частью более крупного макета. –

+0

Проверьте обновленный код. Спасибо –

+0

Действительно, трюк использования дополнительного 'RelativeLayout' дает ожидаемый результат. Хотя я действительно не получаю ваше объяснение «в противном случае android: layout_alignLeft =« @ id/square »пытается выровнять его слева от вашего квадрата« Просмотр ». –

0

RadioButton элемент отсутствует android:layout_centerInParent="true", чтобы держать его в центре экрана или использовать android:layout_centerHorizontal="true" ниже код из centerInParent

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/holo_orange_dark"> 

    <View 
     android:id="@+id/square" 
     android:layout_width="200dip" 
     android:layout_height="200dp" 
     android:layout_centerInParent="true" 
     android:background="@android:color/darker_gray"/> 

    <RadioButton 
     android:layout_alignLeft="@id/square" 
     android:text="Radio button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:background="@android:color/holo_blue_light"/> 

    <View 
     android:layout_width="300dp" 
     android:layout_height="20dp" 
     android:layout_centerInParent="true" 
     android:background="@android:color/holo_green_light" 
     /> 

</RelativeLayout> 
+0

Это не ожидаемый макет, то RadioButton должно быть приведено в соответствие с левым краем квадрата. –

1

из-за относительную шириной макета wrap_content

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="@android:color/holo_orange_dark"> 

<View 
    android:id="@+id/square" 
    android:layout_width="200dip" 
    android:layout_height="200dp" 
    android:layout_centerInParent="true" 
    android:background="@android:color/darker_gray"/> 

<RadioButton 
    android:layout_alignLeft="@+id/square" 
    android:layout_alignStart="@+id/square" 
    android:text="Radio button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/holo_blue_light"/> 

<View 
    android:layout_width="300dp" 
    android:layout_height="20dp" 
    android:background="@android:color/holo_green_light" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

+0

Действительно, установка ширины RelativeLayout в качестве match_parent решает проблему выравнивания. Но, конечно, это также изменяет поведение этого RelativeLayout внутри его родителя. I * нужна * ширина RelativeLayout для wrap_content, поскольку она является частью более крупного макета. –

+0

, в этом случае относительная ширина макета должна быть равна головому зеленому светому представлению, которое имеет максимальную ширину – Ninja