web-dev-qa-db-ja.com

テキスト行を追加するときにTextViewを自動的にスクロールさせるにはどうすればよいですか?

だから、私はそのようなTextViewを持っています:

<TextView
    Android:layout_width="fill_parent"
    Android:layout_height="140.7dp"
    Android:id="@+id/terminalOutput"
    Android:layout_marginBottom="0.0dp"
    Android:scrollbars="vertical"
    Android:scrollbarAlwaysDrawVerticalTrack="true"
    Android:maxLines="8" />

ユーザーに表示される実行ログの一種として使用し、約3分かかるタスクの進行状況を監視できるようにします。ただし、8行を超えると、テキストが画面から消えます。スクロールダウンを試みて手動でポーリングする以外に、画面から外れたことを知る方法がないため、これはユーザーにとって直感的ではありません。

このTextViewにテキストを追加するたびに、できるだけ下にスクロールするようにするにはどうすればよいですか?

また、これはXamarin Androidにありますが、関連があるとは思いません。 JavaとJavaの間の翻訳は簡単です

32
Earlz

ここの答えに従って AndroidでTextViewをスクロール可能にする

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

設定するだけ

_Android:maxLines = "AN_INTEGER"_

Android:scrollbars =レイアウトのxmlファイル内のTextViewの「垂直」プロパティ。

次に使用します:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

あなたのコードで。

うまくいくでしょう。

33
DarwinLouis

コードから、2つの手順を実行する必要があります。

ステップ1

Xamarin Androidでコーディングしますが、JavaのようにxxxActivity.JavaでterminalOutputを呼び出す必要があります

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

パラメーターScrollingMovementMethod()によるメソッドsetMovementMethod()はギミックです。

ステップ2

また、上記のTextView宣言のactivity_xxx.xmlのJava-Androidのようなレイアウトでは、これを追加する必要があります

Android:gravity="bottom"

このようにoutputTextに新しい行を追加すると

outputText.append("\n"+"New text line.");

自動的に最後の行までスクロールしますが、これらはすべてあなたの必要に応じた魔法です。

70
NOTSermsak

これらの答えはどれも私が望んでいたものではなかったので、私はこれを思いつきました。

textView.append(log);

while (textView.canScrollVertically(1)) {
    textView.scrollBy(0, 10);
}

スクロールする前に移動方法を設定することを忘れないでください

textView.setMovementMethod(new ScrollingMovementMethod());
7
dogauzun

同じ質問がありました。これと同様の議論からいくつかの決定を試みましたが、何もうまくいきませんでした。このように解決しました:

_edtConsoleText.setSelection(edtConsoleText.getText().length());
_

すべての.append()の後。

6

次の2つのソリューションで試すことができます。

  1. TextViewをScrollViewに配置する

    <ScrollView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content">
            <TextView
            Android:id="@+id/TextView01"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Your Text" >
        </TextView>
    </ScrollView>
    
  2. カスタムスクロールTextViewを使用します(従来のTextViewと同じですが、スクロールできます)

    import Android.content.Context;
    import Android.graphics.Rect;
    import Android.text.TextPaint;
    import Android.util.AttributeSet;
    import Android.view.animation.LinearInterpolator;
    import Android.widget.Scroller;
    import Android.widget.TextView;
    
     public class ScrollTextView extends TextView {
    
    
        // scrolling feature
        private Scroller mSlr;
    
        // milliseconds for a round of scrolling
        private int mRndDuration = 250;
    
        // the X offset when paused
        private int mXPaused = 0;
    
        // whether it's being paused
        private boolean mPaused = true;
    
        /*
         * constructor
         */
        public ScrollTextView(Context context) {
            this(context, null);
            // customize the TextView
            setSingleLine();
            setEllipsize(null);
            setVisibility(INVISIBLE);
        }
    
        /*
         * constructor
         */
        public ScrollTextView(Context context, AttributeSet attrs) {
            this(context, attrs, Android.R.attr.textViewStyle);
            // customize the TextView
            setSingleLine();
            setEllipsize(null);
            setVisibility(INVISIBLE);
        }
    
        /*
         * constructor
         */
        public ScrollTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // customize the TextView
            setSingleLine();
            setEllipsize(null);
            setVisibility(INVISIBLE);
        }
    
        /**
         * begin to scroll the text from the original position
         */
        public void startScroll() {
            // begin from the very right side
            mXPaused = -1 * getWidth();
            // assume it's paused
            mPaused = true;
            resumeScroll();
        }
    
        /**
         * resume the scroll from the pausing point
         */
        public void resumeScroll() {
    
            if (!mPaused)
                return;
    
            // Do not know why it would not scroll sometimes
            // if setHorizontallyScrolling is called in constructor.
            setHorizontallyScrolling(true);
    
            // use LinearInterpolator for steady scrolling
            mSlr = new Scroller(this.getContext(), new LinearInterpolator());
            setScroller(mSlr);
    
            int scrollingLen = calculateScrollingLen();
            int distance = scrollingLen - (getWidth() + mXPaused);
            int duration = (new Double(mRndDuration * distance * 1.00000
                    / scrollingLen)).intValue();
    
            setVisibility(VISIBLE);
            mSlr.startScroll(mXPaused, 0, distance, 0, duration);
            mPaused = false;
        }
    
        /**
         * calculate the scrolling length of the text in pixel
         * 
         * @return the scrolling length in pixels
         */
        private int calculateScrollingLen() {
            TextPaint tp = getPaint();
            Rect rect = new Rect();
            String strTxt = getText().toString();
            tp.getTextBounds(strTxt, 0, strTxt.length(), rect);
            int scrollingLen = rect.width() + getWidth();
            rect = null;
            return scrollingLen;
        }
    
        /**
         * pause scrolling the text
         */
        public void pauseScroll() {
            if (null == mSlr)
                return;
    
            if (mPaused)
                return;
    
            mPaused = true;
    
            // abortAnimation sets the current X to be the final X,
            // and sets isFinished to be true
            // so current position shall be saved
            mXPaused = mSlr.getCurrX();
    
            mSlr.abortAnimation();
        }
    
        @Override
        /*
         * override the computeScroll to restart scrolling when finished so as that
         * the text is scrolled forever
         */
        public void computeScroll() {
            super.computeScroll();
    
            if (null == mSlr)
                return;
    
            if (mSlr.isFinished() && (!mPaused)) {
                this.startScroll();
            }
        }
    
        public int getRndDuration() {
            return mRndDuration;
        }
    
        public void setRndDuration(int duration) {
            this.mRndDuration = duration;
        }
    
        public boolean isPaused() {
            return mPaused;
        }
     }
    

使い方:

ScrollTextView scrolltext = (ScrollTextView) findViewById(R.id.YourTextView);

(ScrollTextViewクラスのソース: http://bear-polka.blogspot.com/2009/01/scrolltextview-scrolling-textview-for.html

5
Truong Phu Quoc

アクティビティの起動時にScrollViewの一番下までスクロールする方法 」から:

_final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
  @Override
  public void run() {
    scrollview.fullScroll(ScrollView.FOCUS_DOWN);
  }
});
_

必要なのは、追加操作の後にfullScroll()を配置することです。

2
Mansour

Xmarinを使用しています。

私の解決策は、多くの人が言ったように、ScrollView内のtextViewです。

ビューの下部に新しい行を表示する場合は、使用します

Android:layout_gravity="bottom"

これにより、ビューをスクロールするまで新しい行が下部に保持されます。ビューは、スクロールした場所にとどまります。

コードは必要ありません。

ただし、追加後にコンテンツを常に一番下にしたい場合は、append()の後にコードを追加する必要があります。

myText.Append(...);

myscroll.FullScroll(FocusSearchDirection.Down);
2
Jim Oian

私にとっては、これら2つの組み合わせを除いて完璧に機能するものはありませんでした:-

  • Javaクラスでscroller.scrollTo(0, 70);を設定します。textviewを設定する前に、Stringを追加した後に使用します。52dpは私のデバイスの高さです。 .getBottom());そこで、スクロールビューの調整に70を使用しました。
  • 設定Android:scrollY="30dp"あなたのテキストビューで。
0
Surbhit Rao