web-dev-qa-db-ja.com

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

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

実際にはScrollViewを使う必要はありません。

ただ設定する

Android:scrollbars = "vertical"

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

それから:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

あなたのコードで。

ビンゴ、スクロール!

1542
Amit Chintawar

これが私が純粋に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. Scrollviewを定義するとき、Android:layout_height="fill_parent"を指定しないでください。そうしないと、Scrollviewは機能しません。 (これは私に今1時間を無駄にさせました!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());
        }
    });
}
286

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

これを追加するだけであなたのテキストビューを作る

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

入れる必要はありません

Android:Maxlines="AN_INTEGER"`

あなたは単に追加することによってあなたの仕事をすることができます:

Android:scrollbars = "vertical"

そして、このコードをあなたのJavaクラスに入れてください:

textview.setMovementMethod(new ScrollingMovementMethod());
37
Ahsan Raza

どちらでもできます

  1. TextViewScrollViewで囲みます。または
  2. movementメソッドをScrollingMovementMethod.getInstance();に設定します。
26
Samuh

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

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

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

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

18
Valentin Galea

これは、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"/>

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

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

簡単です。これが私のやり方です。

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

私はそれをログ目的に使用しました。

これが役に立つことを願っています;)

12
MBH

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

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

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

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

11
Mark Cramer

これはスクロールバーでスムーズなスクロールテキストを提供します。

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

テキストをテキストビュー内でスクロールさせたい場合は、次のようにします。

まず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"
 />

それでおしまい。

8
Dipendra

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

Android:scrollbars="vertical"

そして最後に、追加

textView.setMovementMethod(new ScrollingMovementMethod());

javaファイル内。

6
user3921740

私はTextViewのスクロールが 'fling'ジェスチャーをサポートすることを見つけることができませんでした。 ScrollViewをさまざまな理由で使用したくないため、私はそれを自分で実装しました。また、テキストを選択してリンクをクリックすることを可能にするMovementMethodがないようでした。

6
android.weasel

これを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());
4
Ritesh

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

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

EditTextソリューションを使用したくない場合は、次のようにしてください。

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

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

Xmlの使用にTextViewを追加している間

<TextView Android:maxLines="1" 
          Android:ellipsize="Marquee"
          Android:scrollHorizontally="true"/>

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

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

これを使って

<TextView  
    Android:layout_width="match_parent" 
    Android:layout_height="match_parent" 
    Android:maxLines = "AN_INTEGER"
    Android:scrollbars = "vertical"
/>
1
Kamil Ibadov

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

0
Petro

これを試して:

Android:scrollbars = "vertical"
0
mohamad sheikhi

テキストビューをスクロール可能にするためのkotlin内

myTextView.movementMethod= ScrollingMovementMethod()

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

    Android:scrollbars = "vertical"
0
Raluca Lucaci

必要なときはいつでも - - ScrollViewを親として使用します 、そしてTextViewではスクロール移動方法も使用します。

そして/ /あなたが - あなたのデバイスを横長にするときにその時に何らかの問題が発生したとき 。ページ全体はスクロール可能ですが、スクロール移動方法は機能しません。

それでもScrollViewを親またはスクロールの移動方法として使用する必要がある場合は、下記のdescも使用します。

問題がなければ、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
D Prince

XML - Android:scrollHorizontally属性を使えます

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

"true"や "false"などのブール値にすることができます。

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

0
sam

XmlのTextView内にmaxLinesscrollbarsを入れます。

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

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

コードの実装

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

Android:scrollbars="vertical"
Android:scrollIndicators="right|end"
0
Sasha 888

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