Ширина макета равная высоте

Есть ли способ иметь высоту, зависящую от ширины в моем xml?

У меня есть несколько кнопок в линейном макете. Ширина кнопок зависит от устройства, потому что они заполняют экран горизонтально. Я хочу иметь квадратные кнопки, и это моя проблема. Можно ли мне помочь?

<Button
            android:id="@+id/b_0xa"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:clickable="false"
            android:text="@string/b_0xa" />

Ответ 1

Вы можете сделать это легко программно в своем Java-коде.

Получите ширину кнопки динамически [используя int x = mButton.getWidth()], а затем используйте значение, возвращаемое для установки высоты [ mButton.setHeight(x)].

P.S.: Желательно использовать LayoutParams для установки высоты и ширины любого вида. Итак, вместо использования setHeight() вы должны использовать setLayoutParams().

mButton.setLayoutParams(new LinearLayout.LayoutParams(x, x));

Ответ 2

Вы должны изменить значения, указанные в android:layout_width и android:layout_height, назначив им фиксированные значения

<Button
            android:id="@+id/b_0xa"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:clickable="false"
            android:text="@string/b_0xa" />

Присвоение им фиксированных значений гарантирует, что независимо от размера экрана ваша кнопка останется прежней, поскольку используемое устройство - это dp. Убедитесь, что значения, которые вы назначили, одинаковы, так как вы хотите квадрат.

Ответ 3

В этом случае я бы рекомендовал использовать layout_weight для вашего атрибута height, затем он назначит пропорциональный вес кнопке, которая будет масштабироваться на разных размерах экрана:

<Button
        android:id="@+id/b_0xa"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight=".4"
        android:clickable="false"
        android:text="@string/b_0xa" />

Чтобы этот подход работал, вы должны применить вес к высоте других видов в макете. Общий вес должен быть равен 1, поэтому вам нужно будет играть с макетами и весами для достижения оптимального дизайна.

Ответ 4

Как я объяснил здесь, если вы хотите сделать это на 100% из XML, вы можете использовать PercentRelativeLayout и сделать следующее:

<android.support.percent.PercentRelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        app:layout_aspectRatio="100%"
        app:layout_widthPercent="100%" />
</android.support.percent.PercentRelativeLayout>

Убедитесь, что вы включили библиотеку в файл приложения gradle:

compile 'com.android.support:percent:XX.X.X'

Ответ 5

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

  <?xml version="1.0" encoding="utf-8"?>
  <androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <Button
        android:id="@+id/b_0xa"
        android:clickable="false"
        android:text="@string/app_name"
        android:layout_width="300dp"
        android:layout_height="0dp"
        android:src="@android:drawable/dark_header"
        app:layout_constraintDimensionRatio="h,16:9"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>