AndroidでTextViewをスクロール可能にする


772

長すぎて1つの画面に収まらないように見えるテキストビューにテキストを表示しています。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);

回答:


1722

ScrollView実際に使用する必要はありません。

設定するだけ

android:scrollbars = "vertical"

TextViewレイアウトのxmlファイル内ののプロパティ。

次に使用します:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

あなたのコードで。

ビンゴ、スクロール!


96
ただし、必ずmaxLines任意の数値を入力する必要があります。これは、すべての画面サイズとフォントサイズで機能するものではありませんか?で単にラップする方が簡単だとScrollView思います。つまり、XMLの属性やコードを追加する必要はありません(移動方法の設定など)。
Christopher Orr 2010

12
@ Christopher、ScrollViewにも 'android:layout_height'が必要です。
Regex Rookie

11
@Regex:そうですね。どちらかあなたは聞かせてScrollView、それが必要として(例えば経て多くのスペースとして取るandroid:fillViewport属性)、またはあなたが望む特定のサイズを設定します。を使用してmaxLinesUI要素のサイズを設定しないでください。これは解決策ではありません。
Christopher Orr

62
maxlinesを定義する必要はありません。残りだけ。
Stevanicus

13
「スムーズな」スクロールについて誰もが言っていることを明確にするには:この方法を使用する場合、スクロールは実際には「スムーズ」(ピクセル単位でスクロールできる)ですが、動的ではありません。指を離すとすぐにスクロールが停止します-フリックはありません。これは現代のUIにはかなり受け入れられないので、他の人がこの「ソリューション」に時間を浪費しないように、回答を編集します。
Timmmm 2015年

310

これは私が純粋に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"、textviewはすべての使用可能なスペースを占有します。

  2. スクロールビューを定義するときは、指定しandroid:layout_height="fill_parent"ないでください。スクロールビューは機能しません。(これにより、私はたった今1時間を無駄にしました!FFS)。

プロのヒント:

テキストを追加した後、プログラムで一番下までスクロールするには、次のようにします。

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

12
を使用する必要はありません。ScrollViewAPIの一部なのでmTextView.getBottom()、メソッドmScrollView.fullScroll(View.FOCUS_DOWN)を使用するだけです。詳細はこちらこちらをご覧ください。
ChuongPham 2013

7
Android は、この例ではLinearLayoutまたはScrollViewは役に立たない可能性があることを警告しています(私はLinearLayout完全に削除しました)。また、についてはTextView、とandroid:layout_height="wrap_content"一致する必要があることも警告していScrollViewます。これらの警告は、この回答が投稿されてから3年が経過したことが原因である可能性があります。とにかく、この回答はスムーズなスクロールとフリックをサポートしています... + 1
skia.heliou 2014

これらをxmlファイルに追加<!--suppress AndroidLintUselessParent -->するScrollViewと、これらの警告が処理されます。
Louie Bertoncin 2015

Android APIレベル9では、「プロのヒント」は機能しません。テキストを追加した後、テキストビューが一番上までスクロールされたままになります。
LarsH

このアプローチは、受け入れられた回答アプローチを使用した方がはるかに優れており、スムーズなユーザーエクスペリエンスを生み出しません。
seyedrezafar

120

本当に必要なのは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);
    }
}

3
このプロパティをXMLで設定する方法はありますか?なぜ彼らはそのオプションを省くのだろうか。
Thalur

動作しますが、スクロール後に更新する方法はありますか?つまり、TextViewをスクロールした後、テキストを変更しますが、必要がない場合でも、その位置はスクロールされたままです。そのbcoseは以前にスクロールを適用していた...
Nirav Dangi

9
スクロールバーがなく、ScrollViewメソッドに比べてスクロールが不格好です。
Jeffrey Blattman、2012

1
StringBuilder代わりにを使用してくださいString...持っているものは少し無駄です。
Alex Lockwood、2012年

4
これは機能しますが、スクロールはスムーズではありません。おかげでまだ動作します。
霜降りの素晴らしい2015

46

これを追加するだけでテキストビューを作成します

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

16
これは動的スクロールを行いません。これは使用しないでください。
Timmmm 2015年

3
@Timmmm動的スクロールを取得する方法?
Ciro Santilli冠状病毒审查六四事件法轮功

読む必要のあるテキストの「動的スクロール」は必要ありません。
驚くべきJan

41

入れる必要はありません

android:Maxlines="AN_INTEGER"`

以下を追加するだけで作業を行うことができます。

android:scrollbars = "vertical"

そして、このコードをJavaクラスに配置します。

textview.setMovementMethod(new ScrollingMovementMethod());

スクロールバーのサイズがテキストに正確にフィットし、スペースを無駄にしないため、承認されたものよりもはるかに優れたソリューションです。
FractalBob 2017

親としてScrollViewを使用している場合、そのときは機能しません
Prince

27

あなたはどちらか

  1. サラウンドTextViewによってScrollView; または
  2. Movementメソッドをに設定しScrollingMovementMethod.getInstance();ます。

22

私が見つけた最良の方法:

TextViewを次の追加属性を持つEditTextに置き換えます。

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

ScrollViewでラップする必要はありません。


2
特にEditTextがTextViewサブクラスであり、問​​題はテキストビューをスクロール可能にする方法であり、問​​題を回避する方法ではないことを考えると、最も簡単で最適な答えは簡単です。私ができれば2票投票するでしょう:)
Justin Buser

4
@JustinBuserこれ以上同意できない。:)これが機能することはまったくの偶然であり、将来のバージョンのAndroidで機能することを保証するものではありません。スクロールする場合は、Androidが提供するスクロールツールを使用してください。 ScrollView正しい方法です。
Madbreaks 2012年

1
@Madbreaksそれについて「不幸な」ことは何もありません。EditTextは、さまざまな長さのテキストに対応するように特別に調整されたいくつかのメソッドとオーバーライドを追加したTextViewです。特にEditTextは、TextView getDefaultMovementMethod関数の戻り値をオーバーライドします。デフォルトの実装はNULLを返します。EditTextは基本的に、他のすべての回答が示唆するのと同じことを行います。Androidが提供するツールの使用に関する限り、EditTextクラスは、これらの回答にある他のどのメソッドよりも非推奨になる可能性がはるかに低いです。
Justin Buser、

4
@JustinBuserそれに関する私の問題はEditTextのデフォルトの動作に依存しているということですが、それは私が非常によく変更する可能性があることを意味しています(EditTextが非推奨になるわけではありません)。あなたはそれを主張することができますが、アイデアは、目の前のタスクに適切なコンポーネントと機能を使用することです。ScrollViewは、スクロールを含むように明示的に設計されました。私はいつも努力しており、常に他の人が仕事に適したツールを使用することを勧めています。ほとんどすべての場合、特定のプログラミング問題には複数のアプローチがあります。とにかく、思慮深い対応に感謝します。
Madbreaks、2012年

16

シンプル。これは私がそれをした方法です:

  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"

TextView xmlファイルに。さらにテキストが入力されると、自動的に下にスクロールします。

もちろん、set textの代わりに、append関数を使用してテキストを追加する必要があります。

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

ログの目的で使用しました。

これが役に立てば幸いです;)


14

これは、XMLのみを使用した「ScrollBarをTextViewに適用する方法」です。

まず、main.xmlファイルでTextviewコントロールを取得し、それにテキストを書き込む必要があります...このように:

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

次に、テキストビューコントロールをscrollviewの間に配置して、このテキストのスクロールバーを表示します。

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

それでおしまい...


6
なぜこれを書くのですか?これは正確ではありませんが、あなたが書いた6か月以上前に投稿された回答とほぼ同じバージョンです。
Justin Buser、

11

これにより、スクロールバーでスムーズなスクロールテキストが提供されます。

ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);

青いアニメーションを有効にします。IMOのベストアンサーです。
グリフィンW.

11

上記のSomeone Somewhere(AndroidでTextViewをスクロール可能にする)の「プロのヒント」はうまく機能しますが、ScrollViewにテキストを動的に追加していて、追加後にのみ自動的に下部までスクロールしたい場合はどうでしょうか。ときに ScrollViewの下部?(おそらく、ユーザーが何かを読むために上にスクロールした場合、追加中に自動的に一番下にリセットしたくないので、これは煩わしいでしょう。)

とにかく、ここにあります:

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

mTextStatus.getLineHeight()は、ユーザーがScrollViewの最後から1行以内にいる場合にscrollToBottom()を実行しないようにします。


10

textview内でテキストをスクロールしたい場合は、次の手順に従います。

まず、textviewをサブクラス化する必要があります。

そしてそれを使用します。

以下は、サブクラス化されたテキストビューの例です。

public class AutoScrollableTextView extends TextView {

    public AutoScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    public AutoScrollableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    public AutoScrollableTextView(Context context) {
        super(context);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(focused)
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean focused) {
        if(focused)
            super.onWindowFocusChanged(focused);
    }

    @Override
    public boolean isFocused() {
        return true;
    }
}

これをXMLで次のように使用する必要があります。

 <com.yourpackagename.AutoScrollableTextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="This is very very long text to be scrolled"
 />

それでおしまい。


7

以下をXMLのテキストビューに追加します。

android:scrollbars="vertical"

そして最後に、

textView.setMovementMethod(new ScrollingMovementMethod());

Javaファイル内。


1
これは動的スクロールを行いません。使用しないでください。
Timmmm 2015年

6

「フリング」ジェスチャーをサポートするTextViewスクロールが見つかりませんでした。上下にフリックした後もスクロールし続けます。さまざまな理由でScrollViewを使用したくなかったため、自分で実装しました。テキストを選択してリンクをクリックできるMovementMethodはありませんでした。


6
soo ...どうやって投げジェスチャーを追加したのですか?
Lou Morda、

6

Kotlinで、テキストビューをスクロール可能に

myTextView.movementMethod= ScrollingMovementMethod()

また、このプロパティをxmlに追加します

    android:scrollbars = "vertical"

5

スクロール可能になったら、ビューに何かを入力するときに、ビューの最後の行に次の行を追加します。

((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);

おい、tablescrollerは、.. uで処理されたXMLのid属性によって識別されたビューです。試してみてください。うまく機能します..その機能は私に..
Rahul Baradia

4

EditTextソリューションを使用したくない場合は、次の方法で運が良さそうです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.yourLayout);
    (TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}

4

これをXMLレイアウトに追加します。

android:ellipsize="marquee"
android:focusable="false"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="To Make An textView Scrollable Inside The TextView Using Marquee"

そして、コードでは次の行を書く必要があります:

textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());

2
これは動的スクロールを行いません。使用しないでください。
Timmmm 2015年

末尾のテキストを省略したくない。どうすればいいのですか。
Sagar Nayak

@SagarNayakはandroid:ellipsize = "none"を使用
Francis

2

以下のコードは、自動水平スクロールテキストビューを作成します。

TextViewをxmlに追加しながら使用する

<TextView android:maxLines="1" 
          android:ellipsize="marquee"
          android:scrollHorizontally="true"/>

onCreate()でTextViewの以下のプロパティを設定します。

tv.setSelected(true);
tv.setHorizontallyScrolling(true); 


1

このように使う

<TextView  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:maxLines = "AN_INTEGER"
    android:scrollbars = "vertical"
/>

0

私の場合。制約レイアウト.AS 2.3。

コードの実装:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

android:scrollbars="vertical"
android:scrollIndicators="right|end"

0

私はこれに1週間以上苦労し、ついにこの作業を行う方法を見つけました!

私の問題は、すべてが「ブロック」としてスクロールすることでした。テキスト自体はスクロールしていましたが、行ごとではなくチャンクとして表示されていました。これは明らかに私にとってはうまくいきませんでした。以前の解決策はすべて私にとってはうまくいかなかったので、私は自分で作成しました。

これが最も簡単な解決策です:

パッケージ内に「PerfectScrollableTextView」というクラスファイルを作成し、このコードをコピーして次の場所に貼り付けます。

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;

public class PerfectScrollableTextView extends TextView {

    public PerfectScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    public PerfectScrollableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    public PerfectScrollableTextView(Context context) {
        super(context);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(focused)
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean focused) {
        if(focused)
            super.onWindowFocusChanged(focused);
    }

    @Override
    public boolean isFocused() {
        return true;
    }
}

最後に、XMLの「TextView」を変更します。

から: <TextView

に: <com.your_app_goes_here.PerfectScrollableTextView


1
100%完璧な答え。説明で言及したのと同じ問題に直面しました。多くのソリューションを適用しますが、完全には機能しません。しかし、ソリューションはすべてのケースで完全に機能します。私の時間を節約し
ましょう

@DaxeshVekariyaよかった!
ペトロ

0

置くmaxLinesscrollbarsXMLでTextViewの内部。

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:maxLines="5" // any number of max line here.
    />

次に、Javaコードで。

textView.setMovementMethod(new ScrollingMovementMethod());


0

TextView内で使用しているときにこの問題が発生しましたScrollView。このソリューションは私のために働いています。

scrollView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                description.getParent().requestDisallowInterceptTouchEvent(false);

                return false;
            }
        });

        description.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                description.getParent().requestDisallowInterceptTouchEvent(true);

                return false;
            }
        });

0

ScrollViewを親として使用する必要があるときはいつでも、TextViewでスクロール移動メソッドも使用します。

また、デバイス縦向きから横向きにすると、問題が発生します。(など)ページ全体がスクロール可能ですが、スクロール移動方法は機能しません。

それでもScrollViewを親またはスクロール移動メソッドとして使用する必要がある場合は、以下の説明も使用します。

問題がない場合は、TextViewの代わりにEditTextを使用します。

下記参照 :

<EditText
     android:id="@+id/description_text_question"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="@null"
     android:editable="false"
     android:cursorVisible="false"
     android:maxLines="6"/>

ここでは、EditTextはTextViewのように動作します。

そしてあなたの問題は解決されます


0

XML- android:scrollHorizontally属性を使用できます

テキストをビューよりも広くすることができるかどうか(したがって、水平方向にスクロールできるかどうか)。

「true」や「false」などのブール値の場合があります。

プリグラマカリー- setHorizontallyScrolling(boolean)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.