更新:我很欣赏使用GridView的建议,我相信这会提供更好的性能。但是,我最初在实现简单的GridView方面的努力导致了可耻的失败。我想弄清楚我做错了什么是另一个话题。为了解决这个实现,我使用OnWindowFocusChanged来查找ANDROID_CONTENT高度,然后除以行数来设置行高。关于这个问题的许多讨论中没有出现的主要教训是OnCreate是设置维度的错误地方。稍后在可以进行精确测量时发生OnWindowFocusChanged。在关于该主题的许多讨论中,并未经常提及这些信息。
ORIGINAL: 我正在研究Android布局,尝试设置一个包含三列四行的电路板。
我想拉伸电路板以垂直和水平填充可用屏幕。我尝试使用weight="1"
选项按行和列嵌套LinearLayout,但只能让它水平拉伸。
在以下配置中,行会拉伸以填充屏幕的宽度,但列设置为“60dp”。我也尝试了GridLayout和TableLayout,但未能获得所需的结果。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft = "10dp"
android:paddingRight = "10dp"
android:background="@drawable/bg" >
<LinearLayout
android:id="@+id/player1"
android:layout_width="match_parent"
android:layout_height="@dimen/positionHeight"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/player2"
android:layout_width="match_parent"
android:layout_height="@dimen/positionHeight"
android:layout_alignParentTop="true"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/row0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/player2"
android:layout_alignParentLeft="true"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/position0"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position1"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position2"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
</LinearLayout>
<LinearLayout
android:id="@+id/row1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/row0"
android:layout_alignParentLeft="true"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/position3"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position4"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position5"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
</LinearLayout>
<LinearLayout
android:id="@+id/row2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/row1"
android:layout_alignParentLeft="true"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/position6"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position7"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position8"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
</LinearLayout>
<LinearLayout
android:id="@+id/row3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/row2"
android:layout_alignParentLeft="true"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/position9"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position10"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
<LinearLayout
android:id="@+id/position11"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="@dimen/positionHeight"
android:orientation="horizontal"
android:background="@drawable/square" />
</LinearLayout>
请给我一些建议。
答案 0 :(得分:9)
我不同意其他人说你必须使用GridLayout。使用LinearLayout尝试这种方法。我为网格的每个单元格使用了通用视图,但任何控件都可以使用。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/red" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/red" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/red" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/red" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/red" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/red" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
这种方法也不需要在代码中手动操作布局,所有内容都是使用权重在xml中处理的。
答案 1 :(得分:0)
你必须试试这个。
<ImageView
android:id="@+id/iv_clm1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/yellow" />
<ImageView
android:id="@+id/iv_clm1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/red" />
</LinearLayout>
<!-- second Row -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv_clm1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/red" />
<ImageView
android:id="@+id/iv_clm2"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/yellow" />
<ImageView
android:id="@+id/iv_clm3"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/red" />
</LinearLayout>
答案 2 :(得分:0)
一般来说,使用这么多布局并不是一个好主意。您应该使用TableLayout
或GridLayout
代替。
<强> GridLayout的:强>
<强> TableLayout:强>
答案 3 :(得分:0)
正如我在上面的UPDATE中提到的,这里真正的技巧是在OnCreate以外的地方设置尺寸。我将player1,player2和position []初始化为xml中的LinearLayout元素,然后在onWindowFocusChanged中调整它们的高度以适应。不像其他人建议的GridView那么好,但它实际上可以让它工作!
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
player1.getLayoutParams().height=content.getHeight()/6;
player2.getLayoutParams().height=content.getHeight()/6;
for (int i=0;i<12;i++){
position[i].getLayoutParams().height=content.getHeight()/6;
}