在Android中自动滚动textview

时间:2014-02-12 17:31:51

标签: android scroll textview

我已经尝试了很多不同的方法,大多数建议在这里找到,但它们似乎都不起作用。我想要实现的是在我的游戏区域下面的聊天区域,一个SurfaceView。当新行被添加到textview时,它应该向上滚动。

首先,它看起来像一个非常简单的任务,但尝试了各种建议,如ScrollView中的TextView,如ScrollView中TableLayout中的TableRow中的TextView,等等......我仍然没有成功。当然这必须是在Android中轻松实现的,对吧?

任务是在屏幕底部显示6行文本,并且最后添加新消息时应向上滚动其余部分,如终端窗口。重要的是它应该在另一个之后添加最新消息,当到达底线时,向上滚动文本并在末尾添加新行。

任何形式的帮助或建议都将受到高度赞赏!!

3 个答案:

答案 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")