Android layout_width & layout_height,它是如何工作的?

Posted

技术标签:

【中文标题】Android layout_width & layout_height,它是如何工作的?【英文标题】:Android layout_width & layout_height, how it works? 【发布时间】:2012-01-31 16:35:12 【问题描述】:

我正在尝试创建一个界面,其中将向用户显示两个或多个按钮,如果单击一个按钮,则会向他显示一些布局。为此,我正在使用 SlidingDrawer

好吧,我对 layout_width 和 layout_height 属性感到困惑

如果我像下面这样设置属性,屏幕上只会显示“Handle 1”。

android:layout_ android:layout_

老实说,我对这两个属性都没有足够的了解。 有人可以分享他对他们的了解吗?

ma​​in.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_>

    <SlidingDrawer android:id="@+id/slidingDrawer1"
            android:layout_ android:layout_
            android:handle="@+id/handle1"
            android:content="@+id/content1">
                <Button android:text="Handle 1" android:layout_
                        android:layout_ android:id="@+id/handle1"></Button>
                <LinearLayout android:id="@+id/content1"
                        android:layout_ android:layout_
                        android:orientation="vertical" android:gravity="center"
                        android:background="#FF444444">
                        <Button android:text="Handle 1 Item 1" android:layout_
                                android:layout_ android:id="@+id/item1"></Button>
                </LinearLayout>
    </SlidingDrawer>

    <SlidingDrawer android:id="@+id/slidingDrawer2"
            android:layout_ android:layout_
            android:handle="@+id/handle2"
            android:content="@+id/content2">
                <Button android:text="Handle 2" android:layout_
                        android:layout_ android:id="@+id/handle2"></Button>
                <LinearLayout android:id="@+id/content2"
                        android:layout_ android:layout_
                        android:orientation="vertical" android:gravity="center"
                        android:background="#FF444444">
                        <Button android:text="Handle 2 Item 1" android:layout_
                                android:layout_ android:id="@+id/item2"></Button>
                </LinearLayout>
    </SlidingDrawer>     
</LinearLayout>

【问题讨论】:

你检查过the documentation吗?很清楚恕我直言。 好问题。几个月前,当我第一次开始时,我对此感到困惑。给它几天,你就会掌握它的窍门。 【参考方案1】:

视图的layout_widthlayout_height 属性旨在供其父容器使用。一些容器忽略其中之一或两者;最尊重他们。您需要查阅容器的文档(在您的情况下是 SlidingDrawer)以了解如何使用这些值。

您没有显示完整的 main.xml,因此很难确切地说出了什么问题。如果您发布错误的图片也会有所帮助。

编辑

看到您的完整布局后,我认为这里的基本问题是您使用 LinearLayout 来包含 SlidingDrawers。正如docs for SlidingDrawer 所指出的,它们需要位于 FrameLayout 或 RelativeLayout(实际上,任何允许多个视图相互叠加的容器)。

另一种可能性是第二个 SlidingDrawer 被直接放置在第一个之下。尝试更改第二个按钮的大小(例如,使文本更长),看看它是否在按钮 1 的任一侧突出。

【讨论】:

我已经提供了完整的main.xml,请看我的问题。【参考方案2】:

我认为您尝试添加 2 个滑动抽屉。

SlidingDrawer 的大小定义了内容滑出后将占用多少空间,因此 SlidingDrawer 通常应该为其两个维度使用 match_parent,在这种情况下,一个与另一个重叠,因此您看不到处理程序 2。

如果您将第一个 SlidingDrawer 的可见性设置为“消失”,您可以看到另一个。

更新

你好,

请尝试此代码可能对您有所帮助

<?xml version="1.0" encoding="utf-8"?>

<SlidingDrawer
    android:id="@+id/slidingDrawer1"
    android:layout_
    android:layout_
    android:layout_weight="1"
    android:content="@+id/content1"
    android:handle="@+id/handle1" >

    <Button
        android:id="@+id/handle1"
        android:layout_
        android:layout_
        android:text="Handle 1" >
    </Button>

    <LinearLayout
        android:id="@+id/content1"
        android:layout_
        android:layout_
        android:background="#FF444444"
        android:gravity="center"
        android:orientation="vertical" >

        <Button
            android:id="@+id/item1"
            android:layout_
            android:layout_
            android:text="Handle 1 Item 1" >
        </Button>
    </LinearLayout>
</SlidingDrawer>

【讨论】:

是的,我想添加多个滑动抽屉,我的问题很清楚。如果我将可见性设置为消失,那么第一个滑动抽屉将变得不可见。【参考方案3】:

fill_parent = match_parent,这意味着它采用“父”容器的宽度或高度(它被指定为哪个属性)

wrap_content 表示高度或宽度取“子”的高度或宽度

您希望使用权重,而不是通常使用 match_parent 或 wrap_content。

当您使用权重时,您希望将宽度设置为 0dp。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_
android:layout_
android:orientation="vertical" >

    <LinearLayout
    android:id="@+id/lowerLayout"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:weightSum="1.0" >
            <LinearLayout
            android:id="@+id/headerLayout"
            android:layout_
            android:layout_
            android:orientation="horizontal"
            android:layout_weight=".7" >
                <Button
                    android:id="@+id/previousMonthButton"
                    android:layout_
                    android:layout_
                    android:text="Previous" />

                <TextView
                    android:id="@+id/monthName"
                    android:layout_
                    android:layout_
                    android:text="Large Text"
                    android:layout_weight="1"
                    android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_horizontal" />

                <Button
                    android:id="@+id/nextMonthButton"
                    android:layout_
                    android:layout_
                    android:text="Next" />

            </LinearLayout>

            <LinearLayout
            android:id="@+id/lowerLayout3"
            android:layout_
            android:layout_
            android:orientation="horizontal"
            android:layout_weight=".3" >

                <Button
                    android:id="@+id/addEvent"
                    android:layout_
                    android:layout_ />

            </LinearLayout>

    </LinearLayout>
    <LinearLayout
    android:id="@+id/lowerLayout2"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:weightSum="1.0" >

        <LinearLayout
            android:id="@+id/monthView"
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:layout_weight=".7" >

        </LinearLayout>

        <ListView
            android:id="@+id/listView1"
            android:layout_
            android:layout_
            android:layout_weight=".3" >
        </ListView>
    </LinearLayout>

</LinearLayout>

【讨论】:

我知道这一点,但是看看我提供的 xml,为什么它只显示“Handle 1”,如果应用上述规则,它应该同时显示“Handle 1”和“Handle 2”。 您正在填充父级两次。尝试使用权重而不是将布局宽度设置为 fill_parent。还要记住,不推荐使用 fill_parent;改用 match_parent。我已经编辑了我的答案,所以我可以给你看一个例子。

以上是关于Android layout_width & layout_height,它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

Android之ListView&ViewPager模拟新闻界面

Android-高级控件-下拉列表(Spinner)&列表视图(ListView)

Android 自定义组件:未找到 layout_width 属性

UI控件之RadioButton(单选按钮)&Checkbox(复选按钮)

我的Android进阶之旅------&gt;怎样在多个LinearLayout中加入分隔线

Android SeekBar 长度与 layout_width 值不匹配