我想实现聊天窗口。也就是说,用户在窗口的底部写入并且新文本向上滚动现有文本。为此,我在里面创建了一个 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 的内容并且不丢失任何文本?
答案 0 :(得分:1)
好的,我终于通过查看Android资源来发现了正在发生的事情。
必须在 LinearLayout 中设置 android:layout_gravity="top"
。
说明:
儿童定位是在ScrollView的 onLayout()上计算的,正好在父类的onLayout()中,类 FrameView 。在那里,如果孩子(即LinearLayout)的layout_gravity为bottom,因为它比ScrollView大,顶部边框位于屏幕外部,具有负位置。因此,列表在顶部被剪切。 LinearLayout的上边框位置必须为0,这可以通过将 layout_gravity 设置为顶部来实现。