聊天窗口ScrollView向下扩展而不是向上扩展

时间:2013-09-22 12:56:26

标签: android scroll android-linearlayout android-scrollview

我想实现聊天窗口。也就是说,用户在窗口的底部写入并且新文本向上滚动现有文本。为此,我在里面创建了一个 ScrollView ,其中包含 LinearLayout 。根据重力布局,新的 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"

对于 ScrollView LinearLayout ,并添加索引为0的新EditText视图,而不是最后的默认视图:

linearLayout.addView(editText, 0);

聊天窗口在相反的方向上完美地运行到最好。它可以向下滚动到输入的第一行。什么都不会丢失。

所以我的问题是必须添加到第一种方法,以使滚动保持 LinearLayout 的内容并且不丢失任何文本?

1 个答案:

答案 0 :(得分:1)

好的,我终于通过查看Android资源来发现了正在发生的事情。

必须在 LinearLayout 中设置

android:layout_gravity="top"

说明:

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