将 GridLayout 替换为 LinearLayout

Replace GridLayout with LinearLayout

我有一个显示计算器屏幕的 GridLayout。它在许多设备上看起来非常好,但在小显示器甚至一些大显示器上完全失败。有个bug in GridLayout implementation but Google is not working on it. You can see details in my half year old question and an accepted answer:

我试图重新实现我的布局。我从 new ConstraintLayout 开始,运气不好。 LinearLayout 非常接近,但我未能拉伸单个单元格。他们不填写可用 space。当我将宽度从 wrap_content 更改为 match_parent 时,布局完全中断。

所有源代码和示例应用程序可在 https://github.com/literakl/CalcTrouble.

获得

当前的线性布局

GridLayout 工作时

Nexus 5 上的 GridLayout 损坏

Nexus S 上的 GridLayout 损坏

布局源码

<LinearLayout
android:id="@+id/calc_content"
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:background="@color/bg_calc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<!--Display row-->
<TextView
    android:id="@+id/assignment"
    android:text="50 + 40 = 90"
    style="@style/Formula"
    android:focusable="false"
    android:layout_width="match_parent"
    android:layout_height="@dimen/calc_display_height"
    tools:ignore="HardcodedText" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- row with 7-9,+ -->
    <LinearLayout
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_width="match_parent">
    <Button
        android:id="@+id/digit7"
        android:text="7"
        style="@style/KeypadLeftButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/digit8"
        android:text="8"
        style="@style/KeypadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/digit9"
        android:text="9"
        style="@style/KeypadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/buttonPlus"
        android:text="+"
        style="@style/KeypadFunctionRightButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />
    </LinearLayout>

    <!--row with 4-6, - -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

    <Button
        android:id="@+id/digit4"
        android:text="4"
        style="@style/KeypadLeftButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/digit5"
        android:text="5"
        style="@style/KeypadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/digit6"
        android:text="6"
        style="@style/KeypadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/buttonMinus"
        android:text="-"
        style="@style/KeypadFunctionRightButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />
    </LinearLayout>

    <!--row with 1-3, * -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

    <Button
        android:id="@+id/digit1"
        android:text="1"
        style="@style/KeypadLeftButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/digit2"
        android:text="2"
        style="@style/KeypadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/digit3"
        android:text="3"
        style="@style/KeypadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/buttonMultiply"
        android:text="\u22C5"
        style="@style/KeypadFunctionRightButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />
    </LinearLayout>

    <!--row with 0, backspace and / -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

    <Button
        android:id="@+id/digit0"
        android:text="0"
        style="@style/KeypadLeftButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/buttonBackspace"
        android:text="←"
        style="@style/KeypadFunctionButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_columnSpan="2"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/buttonDivide"
        android:text=":"
        style="@style/KeypadFunctionRightButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_rowWeight="1"
        app:layout_columnWeight="1"
        tools:ignore="HardcodedText" />
    </LinearLayout>
</LinearLayout>

<!--row with button submit -->

<Button
    android:id="@+id/buttonSubmit"
    android:text="@string/action_next_formula"
    style="@style/KeypadNextButton"
    android:layout_width="match_parent"
    android:layout_height="@dimen/calc_next_height"
    app:layout_gravity="fill_horizontal"/>

</LinearLayout>

如何获得适用于所有设备的所需外观?

将按钮的 width 更改为 0dpheight 更改为 match_parent 以及 layout_weight 更改为 1,如下例所示排

    <!-- row with 7-9,+ -->
    <LinearLayout
        android:layout_height="0dp"
        android:layout_weight="1"
        android:weightSum ="4"
        android:orientation="horizontal"
        android:layout_width="match_parent">
    <Button
        android:id="@+id/digit7"
        android:text="7"
        style="@style/KeypadLeftButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/digit8"
        android:text="8"
        style="@style/KeypadButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:ignore="HardcodedText"  />

    <Button
        android:id="@+id/digit9"
        android:text="9"
        style="@style/KeypadButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/buttonPlus"
        android:text="+"
        style="@style/KeypadFunctionRightButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:ignore="HardcodedText" />
    </LinearLayout>
</LinearLayout>

使用 ConstraintLayouts 你可以实现这个:

布局代码:

<?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">

    <Button
        android:id="@+id/button_top"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <Button
        android:id="@+id/button_bottom"
        android:layout_width="0dp"
        android:layout_height="48dp"
        android:layout_marginBottom="9dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout_content"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:paddingLeft="6dp"
        android:paddingRight="6dp"
        app:layout_constraintBottom_toTopOf="@+id/button_bottom"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_top">

        <android.support.constraint.ConstraintLayout
            android:id="@+id/first_row"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            app:layout_constraintBottom_toTopOf="@+id/second_row"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <Button
                android:id="@+id/button_first_first"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/button_first_second"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_first_second"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_first_first"
                app:layout_constraintRight_toLeftOf="@+id/button_first_third"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_first_third"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_first_second"
                app:layout_constraintRight_toLeftOf="@+id/button_first_fourth"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_first_fourth"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_first_third"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        </android.support.constraint.ConstraintLayout>

        <android.support.constraint.ConstraintLayout
            android:id="@+id/second_row"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            app:layout_constraintBottom_toTopOf="@+id/third_row"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/first_row">

            <Button
                android:id="@+id/button_second_first"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/button_second_second"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_second_second"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_second_first"
                app:layout_constraintRight_toLeftOf="@+id/button_second_third"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_second_third"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_second_second"
                app:layout_constraintRight_toLeftOf="@+id/button_second_fourth"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_second_fourth"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_second_third"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        </android.support.constraint.ConstraintLayout>

        <android.support.constraint.ConstraintLayout
            android:id="@+id/third_row"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            app:layout_constraintBottom_toTopOf="@+id/fouth_row"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/second_row">

            <Button
                android:id="@+id/button_third_first"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/button_third_second"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_third_second"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_third_first"
                app:layout_constraintRight_toLeftOf="@+id/button_third_third"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_third_third"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_third_second"
                app:layout_constraintRight_toLeftOf="@+id/button_third_fourth"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_third_fourth"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button_third_third"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        </android.support.constraint.ConstraintLayout>

        <android.support.constraint.ConstraintLayout
            android:id="@+id/fouth_row"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/third_row">

            <Button
                android:id="@+id/button_fourth_first"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintHorizontal_weight="0.5"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/button_fourth_second"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_fourth_second"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintHorizontal_weight="1"
                app:layout_constraintLeft_toRightOf="@+id/button_fourth_first"
                app:layout_constraintRight_toLeftOf="@+id/button_fourth_third"
                app:layout_constraintTop_toTopOf="parent"/>

            <Button
                android:id="@+id/button_fourth_third"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginBottom="2dp"
                android:layout_marginEnd="2dp"
                android:layout_marginStart="2dp"
                android:layout_marginTop="2dp"
                android:text="Button"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintHorizontal_weight="0.5"
                app:layout_constraintLeft_toRightOf="@+id/button_fourth_second"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        </android.support.constraint.ConstraintLayout>
    </android.support.constraint.ConstraintLayout>


</android.support.constraint.ConstraintLayout>