Android: автоматическая прокрутка EditTextView для приложений чата

Спасибо за внимание, я создаю приложение для чата. Это работает по большей части. Единственное, с чем у меня проблема, так это с прокруткой. Я использую EditText для публикации нового сообщения с сервера.

методом

msg = msg + "\n" + newMsg
EditText.setText(msg)

Мне нужно сделать новый текст, который находится под старым текстом, видимым, как только он появится.

Поэтому я думаю, что лучший способ — автоматически прокручивать вниз, как только вид обновляется.

Есть ли простой способ сделать это? как в макете, может быть?

Еще раз спасибо!

код для макета

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="send"
/>
    <EditText
android:id="@+id/msgBox"
android:layout_height="wrap_content" 
android:layout_width="fill_parent" 
android:layout_alignParentBottom="true" 
android:layout_toLeftOf="@+id/sendButton"
android:gravity="left"
android:longClickable="false"
/>
<EditText  
android:id="@+id/chatBox"
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:editable="false"
android:layout_above="@+id/msgBox"
android:scrollbars="vertical" 
android:gravity="left|top" 
android:isScrollContainer="true" 
android:cursorVisible="false" 
android:longClickable="false" 
android:clickable="false"
android:autoLink="all"
/>
</RelativeLayout>

person Byte    schedule 24.02.2011    source источник


Ответы (3)


Решение состоит в том, чтобы отправить отдельное сообщение пользовательского интерфейса по почте. Это определенно сработает. После того, как вы установите текст/добавите текст в свой TextView внутри ScrollView, обновите ScrollView с помощью метода post (Runnable), как в приведенном ниже коде:

messageView.append(blabla);      
scroller.post(new Runnable() { 
                public void run() { 
                    scroller.smoothScrollTo(0, messageView.getBottom());
                } 
            }); 
person senorcarbone    schedule 01.03.2011
comment
Это работает, чтобы прокрутить ВСЕ вниз! Используйте XML-макет Jignesh stackoverflow.com/questions/5101448/, а затем приведенный выше код SenorCarbone. - person Someone Somewhere; 18.11.2011

Я думаю, что лучший способ сделать это использовать TextView со скроллером, а не EditText, потому что после печати сообщения пользователь не может его редактировать. Попробуйте что-то вроде этого. Это прекрасный способ распечатать сообщение.

<ScrollView android:id="@+id/scroller"
        android:layout_width="fill_parent" android:layout_height="fill_parent"

        android:background="#FFFFFF">
        <TextView android:id="@+id/messageView"
            android:layout_height="fill_parent" android:layout_width="fill_parent"
            android:paddingBottom="8dip" android:background="#ffffff"
            android:textColor="#000000" />
    </ScrollView>

И для автоматической прокрутки вниз вызовите этот метод после нажатия сообщения для просмотра

private void scrollDown() {
        scroller.smoothScrollTo(0, messageView.getBottom());  
}

Здесь скроллер — ScrollView, а messageView — TextView.

Вы также можете распечатать сообщение с другим цветом, используя HTML, например

messageView.append(Html.fromHtml("<font color='green'><b>("+date+") "+ username +":</b></font><br/>"+ message+"<br/>", null, null));
person Jignesh Dhua    schedule 24.02.2011
comment
это очень приятно делать, но я использую EditText, потому что мне нравится внешний вид окна. Я также сделал его не редактируемым и не кликабельным. Я пытался заставить это работать с вашим решением, но кажется, что мой макет является относительным макетом, и он не сочетается с остальными. или может я не правильно делал. пожалуйста, взгляните на мой макет. Спасибо! - person Byte; 24.02.2011
comment
Я был глуп! Я должен был внимательно присмотреться, это было добавление вместо setText, которое заставляет его работать! Теперь это не дойдет до последнего, а до предпоследнего… какой-нибудь комментарий? - person Byte; 28.02.2011
comment
Спасибо за ответ, вы также можете добавлять смайлы, используя HTML.formHTML() - person Jignesh Dhua; 28.02.2011
comment
Пытаться. scroller.smoothScrollTo(0, messageView.getBottom()+5000); - person Jignesh Dhua; 28.02.2011

Попробуйте этот метод: Программная прокрутка EditText

person Michael    schedule 24.02.2011