当键盘出现时,不使用adjustPan来推动ListView

36
我正在尝试创建一个带有ListView和底部发送消息功能的Activity。问题在于当键盘被显示时,底部的内容不是被推上去,而是被隐藏了。我尝试使用adjustPan,但它会推动整个视图(这样就无法看到ListView的顶部元素,并且ActionBar也消失了)。
如果您看一下WhatsApp或Line,它们的功能是:当列表的最后一项显示在屏幕底部时,键盘将推上ListView(而不会使ActionBar或第一个元素移出屏幕),而当列表的最后一项未显示在屏幕底部时(即向上滚动后),键盘会隐藏底部的列表(正常情况下使用adjustResize)。
有人遇到过这个问题吗?
谢谢
编辑:
我将尝试提供一个可视化的示例:
假设这是ListView:
---item 1---  
---item 2---  
---item 3---  
---item 4---  
---EditText---

EditText不是ListView的一部分,而是底部对齐的LinearLayout。当键盘显示时,ListView会变成这样(Item 3和4被键盘隐藏):

---item 1---  
---item 2---  
---EditText---
---Keyboard---  

我希望得到的是:

---item 3---  
---item 4---  
---EditText---
---Keyboard---  
我尝试过android:windowSoftInputMode="adjustPan",结果是项目3和4被顶上去了,不再被键盘隐藏。问题是它把ListView推出了屏幕,所以ActionBar消失了,即使尝试向上滚动,我也永远看不到Item 1和2与键盘一起显示。 希望我解释得清楚,这并不容易... 谢谢

1
你能否发布一张当前的屏幕截图,我不太清楚问题是什么。 - wangyif2
我已经添加了一个例子来尝试解释。谢谢。 - Mehdi
3个回答

54

好的,我已经为您找到了一个解决方案,您想要做的实际上是让ListView在每次滚动时都滚动到底部。您可以通过以下方式实现:

ListView l = getListView();
l.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
l.setStackFromBottom(true);

如果是Activity,则在onCreate方法中执行。如果是Fragment,则在onViewCreated方法中执行。


2
嗨,谢谢。它确实将listView滚动到底部。问题是当我向上滚动listview,然后显示键盘时,它会再次将listview滚动到底部。这会使用户失去他正在查看的项目。只是举个例子,如果你有whatsapp/LINE应用程序,请看一下。当你打开它时,listview在底部,显示键盘,你仍然可以看到最后一个项目,移除键盘并向上滚动,然后再次显示键盘,listview没有滚动到底部... 再次感谢 - Mehdi
2
该死。我不敢相信所有的时间都浪费了 xD。谢谢。 - Mehdi
2
或者在您的布局中添加以下行到您的 listView 中:android:transcriptMode="alwaysScroll" android:stackFromBottom="true" - user1079425
使用listview.setStackFromBottom(true)可以使列表从底部开始而不是从顶部开始,因此我们可以跳过使用listview.setStackFromBottom(true),只需使用listview.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);即可满足要求。 - Narendra Singh
RecyclerView怎么样? - ralphgabb
显示剩余2条评论

13

在您的布局XML中:

android:stackFromBottom="true"
android:transcriptMode="normal"

不需要android:stackFromBottom="true" - Narendra Singh

1
单行解决方案
list_view.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

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