避免布局调整大小

Avoid layout resize

这是我的 activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:background="#ffffff" >

        <ImageView
            android:id="@id/imgLogo"
            android:layout_width="100dp"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:src="@drawable/logo" />

        <TextView
            android:id="@id/txtCurScore"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerInParent="true"
            android:textColor="#000000"
            android:textSize="28sp"
            android:textStyle="bold" />

        <Button
            android:id="@id/btnTopScore"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="@string/strBtnTopScore"
            android:textColor="#000000"
            android:textStyle="bold" />
    </RelativeLayout>

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

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="0px"
            android:layout_weight="1" >

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button4"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="0px"
            android:layout_weight="1" >

            <Button
                android:id="@+id/button5"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button6"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button7"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button8"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="0px"
            android:layout_weight="1" >

            <Button
                android:id="@+id/button9"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button10"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button11"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button12"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="0px"
            android:layout_weight="1" >

            <Button
                android:id="@+id/button13"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button14"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button15"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />

            <Button
                android:id="@+id/button16"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

上面的布局有带图像的 4x4 按钮(图像在代码中添加)。当用户按下按钮时,当 2 个连续的按钮具有相同的图像时,我通过调用 setVisibility(View.GONE).

使这两个按钮不可见

但是我在使用这种方法时遇到了一个问题:只要将按钮设置为不可见,布局就会自行调整大小。例如,如果 button[0][0] 设置为不可见,则第一行中剩余的 3 个按钮将被推向左侧。所以 button[0][1] 现在将占据 button[0][0] 的位置。 button[0][2]将占据button[0][1]的位置,button[0][3]将占据button[0][2]的位置。

请提出一种方法,当按钮左侧的任何元素在线性布局中不可见时,避免按钮在布局中向左移动。

我尝试修改了一堆属性,也在网上搜索了一下。但是我无法对这个问题给出任何具体的答案。请提出解决此问题的方法。

来自文档 view

int INVISIBLE 这个视图是不可见的,但它仍然占用 space 用于布局目的。

int GONE 这个视图是不可见的,它不需要任何 space 用于布局目的。

选项 1: 请使用 View.INVISIBLE 而不是 View.GONE

以上两者有特殊的区别:

INVISIBLE:

This view is invisible, but it still takes up space for layout purposes.

GONE:

This view is invisible, and it doesn't take any space for layout purposes.

因此,通过使用 View.INVISIBLE,button[0][0] 的 space 将保留在 View Hierarchy 中,因此 button[0][ 1] , 按钮[0][2] 和按钮

选项 2: 我们可以动态地使用 java 文件,当用户点击任何按钮时

我正在给出逻辑步骤:

-> User click on button [0][0]

-> click listener of button [0][0] gets callback from Framework

-> save width of parent layout in some variable i.e. parentWidth and gap between buttons i/e/ gap

-> Apply width equals to ((parentWidth/3) - (2*gap)) to button[0][1], button[0][2] and button[0][3]

这样你所有的三个按钮将获得相同的宽度

使用

View.INVISIBLE

而不是

View.GONE

根据问题,您似乎已经对任何视图使用了 setVisibility(View.GONE) 所以基本上 GONE 和 INVISIBLE 之间的区别是 GONE 将隐藏元素并释放布局 space 而 INVISIBLE 将只隐藏元素,但不释放内存中占用的 space。

所以在你的情况下,因为 view.gone 它提供了 space 来保留按钮并且那些按钮变得更宽或不匹配那里的位置,所以请仔细了解用法来使用 GONE 和 INVISIBLE

你好正如上面所有建议的那样,使用按钮的 setVisibility(View.INVISBLE) 属性。 我查看了您的布局我修改了它让我们尝试下面的布局代码。我一定会帮助你。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:orientation="vertical" >

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:background="#ffffff" >

    <ImageView
        android:id="@+id/imgLogo"
        android:layout_width="100dp"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:src="@drawable/logo" />

    <TextView
        android:id="@+id/txtCurScore"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:textColor="#000000"
        android:textSize="28sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btnTopScore"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="TopScore"
        android:textColor="#000000"
        android:textStyle="bold" />
</RelativeLayout>

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:gravity="center" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:gravity="center" >

        <Button
            android:id="@+id/button5"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button6"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button7"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button8"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:gravity="center" >

        <Button
            android:id="@+id/button9"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button10"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button11"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button12"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:gravity="center" >

        <Button
            android:id="@+id/button13"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button14"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button15"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <Button
            android:id="@+id/button16"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center" />
    </LinearLayout>
</LinearLayout>

我在布局中所做的修改,每一行应该匹配父而不是包装内容,使LinearLayout的组件android:gravity=center。现在,当您尝试从代码中隐藏按钮时,它只会将按钮隐藏在他所在的位置,而不是从布局中完全移除。我希望能有所帮助:)