Как разместить виды на равном расстоянии по горизонтали в относительной компоновке? - PullRequest
0 голосов
/ 22 мая 2019

Как разместить эквидистантные виды по горизонтали в relative layout?

Я хочу разместить виды в относительной компоновке, занимая равное пространство в соответствии с количеством добавленных видов, аналогично weight в Linear Layout

Макет, который я пробовал: (для трех просмотров)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--<View
        android:id="@+id/root"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_centerHorizontal="true"
        android:layout_margin="16dp"
        android:background="@android:color/holo_blue_bright"/>-->

    <RelativeLayout
        android:id="@+id/left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true">

        <View
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_centerHorizontal="true"
            android:layout_margin="16dp"
            android:background="@android:color/holo_blue_bright"/>

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/middle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/left">

        <View
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_centerHorizontal="true"
            android:layout_margin="16dp"
            android:background="@android:color/holo_blue_bright"/>

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/middle"
        android:layout_alignParentEnd="true">

        <View
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_centerHorizontal="true"
            android:layout_margin="16dp"
            android:background="@android:color/holo_blue_bright"/>

    </RelativeLayout>

</RelativeLayout>

Проблема с приведенным выше макетом заключается в том, что первые два вида похожи на wrap_content, а третий занимает все оставшееся пространство. Как заставить каждый вид занимать треть горизонтального пространства?

Примечание:
1. Просьба предоставить решение только в относительной схеме, а не в linear layout или constraint layout.
2. Требуемое решение не должно быть вложено в Linear или другие макеты. (Хочу плоский макет)

1 Ответ

1 голос
/ 22 мая 2019

Если вы хотите придерживаться относительной компоновки, вы можете сделать это следующим образом, получите ширину экрана следующим образом (необходимо получить значение в пикселях)

 private int Screendp(){
    DisplayMetrics dm = new DisplayMetrics();

    WindowManager windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
    windowManager.getDefaultDisplay().getMetrics(dm);
    int widthInDP = Math.round(dm.widthPixels / dm.density);
    return widthInDP;
}

это то, как мы можем конвертировать dp в px

  public int dpToPx(int dp) {

    float density = this.getResources()
            .getDisplayMetrics()
            .density;
    return Math.round((float) dp * density);
}

Таким образом, в вашей деятельности установите l layoutparams для каждого и каждого дочернего представления, как показано ниже,

parent= findViewById(R.id.parent);
    left= findViewById(R.id.left );
    middle= findViewById(R.id.middle);
    right= findViewById(R.id.right );



    RelativeLayout.LayoutParams leftparams = new RelativeLayout.LayoutParams(  dpToPx(64), dpToPx(64));
    leftparams.leftMargin= 0;
    left.setLayoutParams(leftparams);

    RelativeLayout.LayoutParams middleparams = new RelativeLayout.LayoutParams(  dpToPx(64), dpToPx(64));
    middleparams.leftMargin=dpToPx((Screendp()/3));
    middle.setLayoutParams(middleparams);

    RelativeLayout.LayoutParams rightparams = new RelativeLayout.LayoutParams(  dpToPx(64), dpToPx(64));
    rightparams.leftMargin=dpToPx((Screendp()/3)*2);
    right.setLayoutParams(rightparams);

Это работает, и я попробовал это.

enter image description here

...