1

我想实现一个聊天窗口。也就是说,用户在窗口底部书写,新文本向上滚动现有文本。为此,我创建了一个内部带有LinearLayout的ScrollView。根据重力布局,新的EditText视图从底部开始添加到LinearLayout :

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="bottom"
    android:layout_gravity="bottom"
    android:fillViewport="true"
    tools:context=".Chat">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="bottom"
        android:layout_gravity="bottom"
        android:layout_alignParentBottom="true"/>

</ScrollView>

这很好用,但是当我想查看屏幕上方的“隐藏文本”并将其向上滚动时,我已经在滚动的末尾并且隐藏的文本已经消失了。相反,ScrollView允许我向下滚动,并且新的空白区域已添加到视图的底部。

只是为了测试相反的方向,我改变了行:

android:gravity="bottom"
android:layout_gravity="bottom"

android:gravity="top"
android:layout_gravity="top"

对于ScrollViewLinearLayout并添加索引为 0 的新 EditText 视图,而不是末尾的默认值:

linearLayout.addView(editText, 0);

聊天窗口从上到下在相反的方向上运行良好。它可以向下滚动到输入的第一行。什么都没有丢失。

所以我的问题是必须在第一种方法中添加什么才能使滚动保留LinearLayout的内容并且不丢失任何文本?

4

1 回答 1

1

好的,我终于通过查看 Android 资源发现了发生了什么。

android:layout_gravity="top"必须在LinearLayout中设置。

解释:

子定位是在ScrollView 的onLayout()中计算的,恰好在父类的 onLayout() 中的 FrameView 类。在那里,如果child(即LinearLayout)的layout_gravity为bottom,因为它比ScrollView大,所以topborder在屏幕之外,具有负定位。因此,列表在顶部被剪切。LinearLayout 的上边框位置必须为 0,这是通过将layout_gravity设置为 top 来实现的。

于 2013-09-28T14:39:25.103 回答