Делаем TextView прокручиваемым на Android - PullRequest
694 голосов
/ 17 ноября 2009

Я отображаю текст в текстовом представлении, которое кажется слишком длинным, чтобы уместиться в один экран. Мне нужно, чтобы мой TextView прокручивался. Как я могу сделать что?

Вот код:

final TextView tv = new TextView(this);
tv.setBackgroundResource(R.drawable.splash);
tv.setTypeface(face);
tv.setTextSize(18);
tv.setTextColor(R.color.BROWN);
tv.setGravity(Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL);
tv.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent e) {
        Random r = new Random();
        int i = r.nextInt(101);
        if (e.getAction() == e.ACTION_DOWN) {
            tv.setText(tips[i]);
            tv.setBackgroundResource(R.drawable.inner);
        }
        return true;
    }
});
setContentView(tv);

Ответы [ 27 ]

1567 голосов
/ 15 июля 2010

Вам не нужно использовать ScrollView на самом деле.

Просто установите

android:scrollbars = "vertical"

свойства вашего TextView в XML-файле вашего макета.

Тогда используйте:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

в вашем коде.

Бинго, оно прокручивается!

293 голосов
/ 16 декабря 2011

Вот как я сделал это чисто в XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ScrollView
        android:id="@+id/SCROLLER_ID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:fillViewport="true">

        <TextView
            android:id="@+id/TEXT_STATUS_ID"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"/>
    </ScrollView>
</LinearLayout>

ПРИМЕЧАНИЯ:

  1. android:fillViewport="true" в сочетании с android:layout_weight="1.0" заставит текстовое представление занять все доступное пространство.

  2. При определении вида прокрутки НЕ указывайте android:layout_height="fill_parent", иначе вид прокрутки не работает! (это заставило меня потратить час впустую только сейчас! FFS).

PRO TIP:

Чтобы программно прокрутить до конца после добавления текста, используйте это:

mTextStatus = (TextView) findViewById(R.id.TEXT_STATUS_ID);
mScrollView = (ScrollView) findViewById(R.id.SCROLLER_ID);

private void scrollToBottom()
{
    mScrollView.post(new Runnable()
    {
        public void run()
        {
            mScrollView.smoothScrollTo(0, mTextStatus.getBottom());
        }
    });
}
119 голосов
/ 12 апреля 2011

Все, что действительно необходимо, это setMovementMethod (). Вот пример использования LinearLayout.

Файл main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/tv1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/hello"
    />
</LinearLayout>

Файл WordExtractTest.java

public class WordExtractTest extends Activity {

    TextView tv1;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv1 = (TextView)findViewById(R.id.tv1);

        loadDoc();
    }

    private void loadDoc() {

        String s = "";

        for(int x=0; x<=100; x++) {
            s += "Line: " + String.valueOf(x) + "\n";
        }

        tv1.setMovementMethod(new ScrollingMovementMethod());

        tv1.setText(s);
    }
}
45 голосов
/ 26 июля 2013

Создайте текстовое представление, просто добавив

TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
37 голосов
/ 05 июня 2016

Не нужно вводить

android:Maxlines="AN_INTEGER"`

Вы можете сделать свою работу, просто добавив:

android:scrollbars = "vertical"

И поместите этот код в свой класс Java:

textview.setMovementMethod(new ScrollingMovementMethod());
26 голосов
/ 19 января 2010

Вы можете либо

  1. окружить TextView на ScrollView; или
  2. установить метод движения на ScrollingMovementMethod.getInstance();.
18 голосов
/ 20 февраля 2012

Лучший способ, который я нашел:

Замените TextView на EditText с этими дополнительными атрибутами:

android:background="@null"
android:editable="false"
android:cursorVisible="false"

Нет необходимости в переносе в ScrollView.

13 голосов
/ 06 июня 2012

Это «Как применить ScrollBar к вашему TextView», используя только XML.

Во-первых, вам нужно взять элемент управления Textview в main.xml файле и записать в него некоторый текст ... вот так:

<TextView
    android:id="@+id/TEXT"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/long_text"/>

Затем поместите элемент управления представлением текста между просмотром прокрутки, чтобы отобразить полосу прокрутки для этого текста:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">

    <ScrollView
        android:id="@+id/ScrollView01"
        android:layout_height="150px"
        android:layout_width="fill_parent">

        <TextView
            android:id="@+id/TEXT"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/long_text"/>

    </ScrollView>
</RelativeLayout>

Вот и все ...

13 голосов
/ 05 февраля 2016

Simple. Вот как я это сделал:

  1. Сторона XML:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        tools:context="com.mbh.usbcom.MainActivity">
        <TextView
            android:id="@+id/tv_log"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:text="Log:" />
    </RelativeLayout>
    
  2. Сторона Java:

    tv_log = (TextView) findViewById(R.id.tv_log);
    tv_log.setMovementMethod(new ScrollingMovementMethod());
    

Бонус:

Чтобы текстовое представление прокручивалось вниз по мере заполнения текста, вам необходимо добавить:

    android:gravity="bottom"

в текстовый XML-файл. Он будет прокручиваться автоматически по мере поступления текста.

Конечно, вам нужно добавить текст, используя функцию добавления, а не задавать текст:

    tv_log.append("\n" + text);

Я использовал его для целей журнала.

Надеюсь, это поможет;)

11 голосов
/ 20 мая 2013

Приведенный выше «совет для профессионалов» от Someone Somewhere ( Обеспечение прокрутки TextView на Android ) отлично работает, однако, что если вы динамически добавляете текст в ScrollView и хотите автоматически прокрутить до нижней после добавления только когда пользователь находится внизу ScrollView? (Возможно, потому что, если пользователь прокрутил что-то, чтобы прочитать что-то, вы не хотите автоматически сбрасывать его во время добавления, что будет раздражать.)

В любом случае, вот оно:

if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
        (mScrollView.getHeight() + mTextStatus.getLineHeight())) {
    scrollToBottom();
}

mTextStatus.getLineHeight () сделает так, чтобы вы не использовали scrollToBottom (), если пользователь находится в пределах одной строки от конца ScrollView.

...