Willis
Willis

Reputation: 23

Auto-scrolling textview in Android

I've tried a lot of different ways, most of the suggestions found here, but none of them seems to work. What I'm trying to achieve is at chat area below my game area, a SurfaceView. It is supposed to scroll upwards as new lines are added to the textview.

At first, it looks like a really simple task, but having tried all kinds of suggestions, like a TextView in a ScrollView, like a TextView in a TableRow in a TableLayout in a ScrollView, and so on...I've still not made it happen. Of course this must be something easily achieved in Android, right??

The task is to display like 6 lines of text in the bottom of the screen, and as a new message is added last it should scroll the rest upwards, like a terminal window. The important thing is that it should add the latest message after the other and, when reached the bottom line, scroll the text upwards and add the new line(s) at the end.

Any kind of help or suggestions would be highly appreciated!!

Upvotes: 1

Views: 1268

Answers (3)

Owen B
Owen B

Reputation: 1184

I've achieved this (crudely!) by maintaining my own list, deleting the lowest element then adding at the end each time. Here i've just got a 3 line window:

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) );
}

then in the activity:

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

Upvotes: 0

Hamid Shatu
Hamid Shatu

Reputation: 9700

Suppose, you declared your ScrollView as follows...

private ScrollView mScrollView;

you initialized it as...

mScrollView = (ScrollView) findViewById(R.id.scroll_view_chat_window);

Now, create a method to perform scroll down when you call the method. Inside the method implement a thread which will do the scroll down independently. And call the method after every chat message update thats will do the auto-srcoll functionality.

private void scrollDown() {

    mScrollView.post(new Runnable() {
        @Override
        public void run() {
            mScrollView.smoothScrollTo(mScrollView.getScrollY(), mScrollView.getScrollY()
                    + mScrollView.getHeight());
        }
    });
}

Upvotes: 0

nKn
nKn

Reputation: 13761

I needed the same behavior in one of my apps and I achieved in just with one command:

view.setGravity(Gravity.BOTTOM);

Or, analogously, setting this attribute in your layout:

android:gravity="bottom"

Then simply add your lines using:

your_text_view.append(newLine);

Upvotes: 2

Related Questions