我已经尝试了很多不同的方法,大多数建议在这里找到,但它们似乎都不起作用。我想要实现的是在我的游戏区域下面的聊天区域,一个SurfaceView。当新行被添加到textview时,它应该向上滚动。
首先,它看起来像一个非常简单的任务,但尝试了各种建议,如ScrollView中的TextView,如ScrollView中TableLayout中的TableRow中的TextView,等等......我仍然没有成功。当然这必须是在Android中轻松实现的,对吧?
任务是在屏幕底部显示6行文本,并且最后添加新消息时应向上滚动其余部分,如终端窗口。重要的是它应该在另一个之后添加最新消息,当到达底线时,向上滚动文本并在末尾添加新行。
任何形式的帮助或建议都将受到高度赞赏!!
答案 0 :(得分:2)
我在我的一个应用程序中需要相同的行为,而我只用一个命令就可以实现:
view.setGravity(Gravity.BOTTOM);
或者,类似地,在布局中设置此属性:
android:gravity="bottom"
然后使用以下方法添加您的行:
your_text_view.append(newLine);
答案 1 :(得分:0)
假设您将 ScrollView 声明如下......
private ScrollView mScrollView;
你把它初始化为......
mScrollView = (ScrollView) findViewById(R.id.scroll_view_chat_window);
现在,创建一个方法,在调用方法时执行向下滚动。在该方法内部实现一个线程,该线程将独立向下滚动。并且在每次聊天消息更新之后调用该方法将执行auto-srcoll功能。
private void scrollDown() {
mScrollView.post(new Runnable() {
@Override
public void run() {
mScrollView.smoothScrollTo(mScrollView.getScrollY(), mScrollView.getScrollY()
+ mScrollView.getHeight());
}
});
}
答案 2 :(得分:0)
我通过维护自己的列表实现了这个(粗略地!),删除了最低元素,然后每次都添加。在这里,我只有一个3行窗口:
public class MessageWindow {
private ArrayList <String> msgs;
private Activity parentActivity;
public MessageWindow(Activity act, int allMsgsMax) {
this.parentActivity = act;
msgs = new ArrayList <String> ();
// create empty list elements for initial display
for (int i = 0; i < allMsgsMax; i++){
msgs.add("");
}
}
//
public void put (String msg){
msgs.remove(0);
msgs.add(msg);
// get a handle to the textview 'messages', a 3-line box
TextView t2v = (TextView) parentActivity.findViewById(R.id.messages);
// crappy but you get the idea:
t2v.setText(msgs.get(0) + "\n" + msgs.get(1) + "\n" + msgs.get(2) );
}
然后在活动中:
protected MessageWindow messageWindow;
// setup splash screen
messageWindow = new MessageWindow(this, 3);
// write some stuff - row1 will disappear off the top of the box
messageWindow.put ("row1")
messageWindow.put ("row2")
messageWindow.put ("row3")
messageWindow.put ("row4")