当ScrollView内的布局大于ScrollView时,layout_weight不起作用

时间:2013-06-26 20:51:17

标签: android android-layout android-linearlayout android-xml android-scrollview

我正在尝试使用线性布局的layout_weight作为scrollview内部的高度。但是我发现layout_weight只适用于fillViewPort = true,并且如果有足够的剩余空间可以展开linear_weight。

我在下面列出了三个示例,我希望将#View和#3中的textView设置为xml级别的#1。 正如您在链接中看到的那样,在#2,#3中,textView自动更改。

以下是我的例子。 TextViews和Buttons包含在LinearLayout内部,然后包含在scrollView中。

1。 Layout_weight相对于父级完美地工作。 (工作)

http://s22.postimg.org/v0gl2tmyp/Screen_Shot_2013_06_26_at_4_30_51_PM.png

2。 Layout_weight相对于剩余空间而不是父级工作。(不工作)

http://s22.postimg.org/sx65v5n5t/Screen_Shot_2013_06_26_at_4_30_44_PM.png

3布局_重量被忽略(不工作)

http://s22.postimg.org/ibmaj5gu9/Screen_Shot_2013_06_26_at_4_40_32_PM.png

这是我的#3的xml代码。 #2和#1基本上是相同的代码,没有或没有按钮。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weighSum="1"
    android:fillViewport="true" >

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

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />

        <Button
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:text="Accept" />


        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="6"
            android:background="#AAABBB"
            android:text="hello" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="3"
            android:background="#BBBAAA"

            android:text="hello" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="5"
            android:background="#AAABBB"

            android:text="hello" />
    </LinearLayout>

</ScrollView>

3 个答案:

答案 0 :(得分:2)

这些图像正是我期望为你的xml看到的。

这可能会对您有所帮助:

  1. 当系统布局时使用权重方法将View放在屏幕上,它只根据权重分配备用空间,而不是空间。因此,为了使其分配根据权重分配的总空间(这是大多数人直观期望的),您必须将您希望它工作的维度设置为0dip。因此,对于那些ButtonTextView,您需要设置

    android:layout_height = "0dip"
    
  2. 您可能还需要强制ScrollView填充视口以阻止所有内容进行整理。见here

    android:fillViewport="true"
    
  3. 个人观察。有时权重似乎是反向的(即较小的权重会产生更多的空间)。 YMMV。

答案 1 :(得分:2)

重量按设计工作。也许不是你希望他们“工作”的方式,但说他们“不工作”是不准确的。考虑一下你的第三种情况,你期望TextViews的像素大小是多少?权重是可用空间的百分比(不是父项的总大小)。 scrollview和linearlayout至少是屏幕的大小,否则是所有子视图的总和。因此,如果您的孩子视图超出了屏幕的大小(没有权重的视图),您希望为剩余视图(具有0dp和权重的视图)分配多少空间?关键是空间量是任意的,android不会尝试假设你想要多少空间,因为它没有可能的知道方式。

TL; DR - 在文本视图上设置minHeight(以dp为单位),以处理按钮太多的情况。

答案 2 :(得分:1)

尝试在具有layout_weight的元素上设置layout_height =“0dp”。封闭的布局对象将使用任何可用空间来尽可能多地增长它们。

你对weightSum的使用也有点疑问。通常,weightSum应该> =所包含视图的总权重。你有一个weightSum,其中没有直接封闭的视图有权重,另一个是封闭视图的总重量超过weightSum。第二种情况会导致奇怪的行为。