避免布局调整大小
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。现在,当您尝试从代码中隐藏按钮时,它只会将按钮隐藏在他所在的位置,而不是从布局中完全移除。我希望能有所帮助:)
这是我的 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。现在,当您尝试从代码中隐藏按钮时,它只会将按钮隐藏在他所在的位置,而不是从布局中完全移除。我希望能有所帮助:)