Ширина макета равная высоте
Есть ли способ иметь высоту, зависящую от ширины в моем 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>