在安卓系统中创建磁贴式菜单

3
我需要创建一个像这样的布局: enter image description here 我是 Android 新手,正在创建一个布局。
这是我的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"
    android:orientation="vertical" >

    <LinearLayout

        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/bg"
        android:orientation="vertical"
        android:padding="10dp" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/button"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@drawable/btn_home"
                android:paddingRight="10dp" />

            <Button
                android:id="@+id/button1"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:background="#721480" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#721422"
                android:paddingRight="10dp" />

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#723422"
                android:paddingRight="10dp" />

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#724422" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:background="#723111"
                android:paddingRight="10dp" />

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#754300" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#700000"
                android:paddingRight="10dp" />

            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:background="#724500" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

但它不符合我的要求。我有两个问题:

  1. 我不知道如何强制按钮的宽度和高度保持相同的大小。
  2. 为什么按钮中的填充不起作用?

是否有人可以帮我找出答案?


1
最好的实现此类布局的方法是使用<TableLayout>,它广泛地为您提供了许多选项... - Iamat8
2个回答

2
你可以尝试在布局中使用android:weightSum属性和android:layout_weight来控制权重。
这个属性可以帮助你让元素每次填充相同的空间。
看看这个例子:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="4"
    android:orientation="horizontal"
    android:layout_gravity="center"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">


    <Button
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:text="New Button"
        android:id="@+id/button2"
        android:layout_weight="2"/>

    <Button
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:text="New Button"
        android:id="@+id/button3"
        android:layout_weight="1"/>

    <Button
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:text="New Button"
        android:id="@+id/button4"
        android:layout_weight="1"/>
</LinearLayout>

它将创建一个具有3个按钮的布局。第一个按钮将填充一半的布局,另外两个按钮将填满剩余的空间。如下图所示: enter image description here P.S.:fill_parent已被弃用,请改用match_parent。
编辑:在此方法中,填充不太可能按您的预期工作。但是,如果您想增加按钮之间的间距,可以简单地使用android:layout_margin。
请参见下面的图像,了解这两者之间的区别。 enter image description here

非常感谢!但我需要按钮之间的填充而不是围绕按钮的填充。在线性布局中设置填充不会影响按钮之间的填充。 - MSepehr
1
你需要填充还是边距?这里有区别:http://i.stack.imgur.com/PeSIJ.gif - Mauker

0

在同一元素上结合填充权重有时可能会变得棘手。

回答你的第一个问题 - 如何使元素成为正方形 - 创建扩展Button并覆盖onMeasure方法的自定义按钮:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    if(width > height) {
        super.onMeasure(heightMeasureSpec, heightMeasureSpec);
    } else {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
}

回答你的第二个问题 - 当与权重结合时会有些棘手。通过使用权重属性,您告诉按钮无论其内容是什么,都要占据1/3或2/3的空间。在这种情况下,填充本身并没有什么意义,因为根据定义,填充是视图内容(实际文本或图像)与其边缘之间的空间量。而且,由于您刚刚告诉按钮扩展父级的1/3或2/3边缘...如果视图的内容不适合并且必须滚动,则可能会看到填充。您可以通过具有处理权重的另一层布局并让您的按钮处理填充来绕过它。类似这样:
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:weightSum="3" >

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        ... >
        <Button
            android:id="@+id/button"
            android:layout_width="?"
            android:layout_height="?"
            android:layout_marginRight="10dp"
            android:background="@drawable/?" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        ... >
        <Button
            android:id="@+id/button1"
            android:layout_width="?"
            android:layout_height="?"
            android:background="#721480" />
    </LinearLayout>
</LinearLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接