带有浮动LinearLayout的ScrollView无法滚动。

4

这是我的GUI XML:

<FrameLayout android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:id="@+id/frameLayout"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ScrollView android:layout_width="fill_parent" android:id="@+id/scrollView"
        android:fillViewport="true" android:layout_height="fill_parent">

        <LinearLayout android:layout_width="fill_parent"
            android:orientation="vertical" android:id="@+id/contentLayout"
            android:padding="5dip" android:fadingEdge="vertical"
            android:layout_height="fill_parent">
            <TextView android:id="@+id/lblName" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:text="@string/label_name"></TextView>
            <LinearLayout android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:id="@+id/nameLayout">
                <CheckBox android:layout_width="wrap_content"
                    android:layout_height="wrap_content" android:id="@+id/chkName"></CheckBox>
                <TextView android:layout_marginLeft="4dip"
                    android:layout_marginRight="4dip" android:id="@+id/txtName"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:textColor="@color/white" android:text="TextView"
                    android:layout_weight="1" android:textSize="20dip"></TextView>
            </LinearLayout>
            <TextView android:id="@+id/lblPhone" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:text="@string/label_phone"></TextView>
            <LinearLayout android:isScrollContainer="false"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:orientation="vertical" android:id="@+id/lstPhone"></LinearLayout>
            <TextView android:id="@+id/lblEmail" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:text="@string/label_email"></TextView>
            <LinearLayout android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:orientation="vertical"
                android:id="@+id/lstEmail"></LinearLayout>
            <TextView android:id="@+id/lblAddress" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:text="@string/label_address"></TextView>
            <LinearLayout android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:orientation="vertical"
                android:id="@+id/lstAddress"></LinearLayout>
        </LinearLayout>
    </ScrollView>
    <LinearLayout android:background="@color/grey"
        android:layout_width="fill_parent" android:paddingTop="5dip"
        android:layout_height="wrap_content" android:orientation="horizontal"
        android:layout_gravity="bottom|right" android:id="@+id/commandLayout">
        <Button android:id="@+id/btnToClipBoard" android:layout_width="fill_parent"
            android:layout_height="fill_parent" android:text="To ClipBoard"
            android:layout_weight="1"></Button>
        <Button android:id="@+id/btnCancel" android:layout_width="fill_parent"
            android:layout_height="fill_parent" android:text="Cancel"
            android:layout_weight="1"></Button>
    </LinearLayout>
</FrameLayout>

LinearLayout的id为commandLayout,始终保持在窗口底部。但是id为contentLayout的LinearLayout无法滚动。如果我将commandLayout移动到scrollView中,所有内容都会滚动。但这并不是我想要的。我希望无论contentLayout有多长,都能看到按钮。非常感谢您的帮助。我已经花了大部分时间在这个问题上了...谢谢。

编辑:感谢所有回复。将FrameLayout更改为RelativeLayout,并将commandLayout设置为父布局底部对齐,scrollview设置为父布局顶部对齐是最好的解决方案。


如果有帮助的话,我会在活动创建时使用LayoutInflater来添加项目... - bytebender
只是猜测:将ScrollView的高度设置为“wrap_content”,并添加“weight=1”。而且,为什么在宽度为“fill_parent”的commandLayout中需要“gravity”“bottom | right”?也许只有“bottom”就足够了吧? - ernazm
谢谢您的回复,我已经尝试了您建议的方法,但仍然无法解决问题。 - bytebender
我正在使用HorizontalScrollView而不是使用ScrollView - AZ_
增加更多的项目并删除所有不必要的属性。添加大量元素以便可以滚动。这只是一个想法。 - AZ_
只是一个想法:为什么不使用自定义ListView呢?如果你有多个项目的话?而且,正如Harism所说,你可以修复你的按钮(id:commandLayout)。 - Kartik Domadiya
3个回答

2

是否有必要使用FrameLayout?如果我正确理解了您的目标,也许RelativeLayout可以实现您期望的效果;

<RelativeLayout ...>
    <LinearLayout
        android:layout_alignParentBottom="true"
        android:id="@+id/commandLayout" ... />
    <ScrollView
        android:layout_alignParentTop="true"
        android:layout_above="@id/commandLayout"
        android:id="@+id/scrollView" .../>
</RelativeLayout>

现在我注意到你想让“commandLayout”浮动在ScrollView上方,如果你将两个元素都对齐到父边界,使用RelativeLayout也可能实现。但是目前我无法验证这一点,特别是不知道它是否比使用FrameLayout更好。 - harism

2

我将基本布局 "frameLayout" 更改为相对布局。

我这样做是为了让 "commandLayout" 位于 "scrollView" 下方。 如果要显示的内容被 "commandLayout" 隐藏,那就没有意义了。

我在 "commandLayout" 上添加了 alignParentBottom。 我还在 "scrollView" 上添加了 layout_above="@+id/commandLayout"。

这是可工作的 xml,并且可以滚动 =)

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/relativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<ScrollView 
    android:layout_width="fill_parent"
    android:id="@+id/scrollView"
    android:fillViewport="true"
    android:layout_height="fill_parent"
    android:layout_above="@+id/commandLayout"
>
    <LinearLayout 
        android:layout_width="fill_parent"
        android:orientation="vertical"
        android:id="@+id/contentLayout"
        android:padding="5dip"
        android:fadingEdge="vertical"
        android:layout_height="fill_parent"
    >
        <TextView
            android:id="@+id/lblName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        >
        </TextView>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/nameLayout"
        >
            <CheckBox 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/chkName">
            </CheckBox>
            <TextView
                android:layout_marginLeft="4dip"
                android:layout_marginRight="4dip"
                android:id="@+id/txtName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#FFFFFF"
                android:text="TextView"
                android:layout_weight="1"
                android:textSize="20dip">
            </TextView>
        </LinearLayout>

        <TextView
            android:id="@+id/lblPhone"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        >
        </TextView>
        <LinearLayout
            android:isScrollContainer="false"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/lstPhone">
        </LinearLayout>
        <TextView
            android:id="@+id/lblEmail"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        >
        </TextView>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/lstEmail"
        >
        </LinearLayout>
        <TextView
            android:id="@+id/lblAddress"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        >
        </TextView>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/lstAddress">
        </LinearLayout>
        <TextView
            android:id="@+id/LongText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="40sp"
            android:text="This is a super long text that will hopefully cover the whole screen so as the scroll will work."
        >
        </TextView>

         <TextView
            android:id="@+id/AnotherLongText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="40sp"
            android:text="This is another super long text to show that the scrolling will work even more!"
        >
        </TextView>
    </LinearLayout>
</ScrollView>

<LinearLayout
    android:background="#737754"
    android:layout_width="fill_parent"
    android:paddingTop="5dip"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/commandLayout"
    android:layout_alignParentBottom="true"
>
    <Button
        android:id="@+id/btnToClipBoard"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="To ClipBoard"
        android:layout_weight="1">
    </Button>
    <Button
        android:id="@+id/btnCancel"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="Cancel"
        android:layout_weight="1">
    </Button>
</LinearLayout>
</RelativeLayout>

1
不要忘记你的闭合标签哦……谢谢 - bytebender
谢谢你指出来,这个错误没有在代码框中被捕获。 - Creniale

0

我可能没有完全理解问题是什么,但是我试了一下你放上去的布局文件,发现列表底部被两个按钮遮挡住了。所以我在ScrollView小部件中添加了以下内容,看起来好像没问题了。

android:layout_marginBottom="60dip"

但是,也许我漏掉了什么。


是的,它可以滚动。我在列表中添加了一些复选框,使其超过一页的长度。 - Rajath

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