文本按钮均匀分布在Gridlayout中

时间:2017-07-12 22:18:06

标签: android xml

我想将6个按钮放在2 * 3网格布局中,而所有这些按钮均匀地占据网格布局单元格。我将按钮重量设置为1,一切都很好,直到我在一些按钮上添加一些长文本。这是我的XML代码:

<GridLayout
android:layout_width="match_parent"
android:layout_height="165dp"
android:columnCount="3"
android:rowCount="2">

<Button
    android:id="@+id/arithmeticMeanButton"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:text="Arithmetic\nMean"
    android:textSize="18sp" />

<Button
    android:id="@+id/modeButton"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:text="Mode"
    android:textSize="18sp" />

<Button
    android:id="@+id/rangeButton"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:text="Range"
    android:textSize="18sp" />

<Button
    android:id="@+id/medianButton"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:text="Median"
    android:textSize="18sp" />

<Button
    android:id="@+id/varianceButton"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:text="Variance"
    android:textSize="18sp" />

<Button
    android:id="@+id/standardDeviationButton"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:text="Standard\nDeviation"
    android:textSize="18sp" />
</GridLayout>

如您所见,算术平均值或标准偏差等按钮比其他按钮占用更多空间。我应该怎么做才能让所有按钮均匀地显示在布局中?

1 个答案:

答案 0 :(得分:2)

简短回答

将这些属性添加到所有六个按钮:

android:layout_width="0dp"
android:layout_height="0dp"

更长的答案

权重的概念与父视图中多余空间的分布有关。在您的示例中,具有最长文本的按钮更宽,因为系统首先为每个按钮提供足够的宽度以适合其文本,然后为每个按钮提供剩余宽度的相等部分。将每个按钮设置为根本没有固有宽度将导致系统为每个按钮提供屏幕宽度的三分之一。

但是,请注意,GridLayout中对权重的支持仅在API 21中添加,因此如果您的应用必须在较旧的API版本上运行,此解决方案最终只会为您提供一堆0大小的按钮。

鉴于您知道自己需要2x3网格,可以使用ConstraintLayout来实现布局。创建两个垂直指南(33%和67%)和一个水平指南(50%),然后将按钮相对于这些指南和父级定位。

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="165dp">

    <android.support.constraint.Guideline
        android:id="@+id/guidelineColumn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.33"/>

    <android.support.constraint.Guideline
        android:id="@+id/guidelineColumn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.67"/>

    <android.support.constraint.Guideline
        android:id="@+id/guidelineRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

    <Button
        android:id="@+id/arithmeticMeanButton"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="18sp"
        android:text="Arithmetic\nMean"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/guidelineColumn1"
        app:layout_constraintBottom_toTopOf="@id/guidelineRow1"/>

    <Button
        android:id="@+id/modeButton"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="18sp"
        android:text="Mode"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@id/guidelineColumn1"
        app:layout_constraintRight_toLeftOf="@id/guidelineColumn2"
        app:layout_constraintBottom_toTopOf="@id/guidelineRow1"/>

    <Button
        android:id="@+id/rangeButton"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="18sp"
        android:text="Range"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@id/guidelineColumn2"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@id/guidelineRow1"/>

    <Button
        android:id="@+id/medianButton"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="18sp"
        android:text="Median"
        app:layout_constraintTop_toBottomOf="@id/guidelineRow1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/guidelineColumn1"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <Button
        android:id="@+id/varianceButton"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="18sp"
        android:text="Variance"
        app:layout_constraintTop_toBottomOf="@id/guidelineRow1"
        app:layout_constraintLeft_toRightOf="@id/guidelineColumn1"
        app:layout_constraintRight_toLeftOf="@id/guidelineColumn2"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <Button
        android:id="@+id/standardDeviationButton"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="18sp"
        android:text="Standard\nDeviation"
        app:layout_constraintTop_toBottomOf="@id/guidelineRow1"
        app:layout_constraintLeft_toRightOf="@id/guidelineColumn2"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</android.support.constraint.ConstraintLayout>