По сути, я хочу, чтобы это был квадрат, заполняющий экран по горизонтали. Но что указать для высоты? В качестве примера я использовал FrameLayout, но это может быть любое представление.
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "?">
Если вы используете ConstraintLayout, вы можете указать DimensionRatio представления с помощью app: layout_constraintDimensionRatio = "1"
Как это:
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity">
<TextView
android:layout_width = "0dp"
android:layout_height = "0dp"
android:text = "Hello World!"
app:layout_constraintDimensionRatio = "1"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintLeft_toLeftOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
(В ConstraintLayout вы не используете match_parent, но вы можете использовать 0dp, что эквивалентно match_constraint, и если вы установите горизонтальные ограничения для parent, он соответствует ширине родителей)
Так что сделать это только с помощью макета невозможно.
Для этого вы должны создать View и расширить FrameLayout, а затем переопределить onMeasure.
public class SquareFramelayout extends Framelayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
}