だから、私はそのような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の間の翻訳は簡単です
ここの答えに従って AndroidでTextViewをスクロール可能にする
実際にScrollViewを使用する必要はありません。
設定するだけ
_
Android:maxLines = "AN_INTEGER"
_Android:scrollbars =レイアウトのxmlファイル内のTextViewの「垂直」プロパティ。
次に使用します:
yourTextView.setMovementMethod(new ScrollingMovementMethod());
あなたのコードで。
うまくいくでしょう。
コードから、2つの手順を実行する必要があります。
Xamarin Androidでコーディングしますが、JavaのようにxxxActivity.JavaでterminalOutputを呼び出す必要があります
TextView outputText = (TextView) findViewById(R.id.terminalOutput);
outputText.setMovementMethod(new ScrollingMovementMethod());
パラメーターScrollingMovementMethod()によるメソッドsetMovementMethod()はギミックです。
また、上記のTextView宣言のactivity_xxx.xmlのJava-Androidのようなレイアウトでは、これを追加する必要があります
Android:gravity="bottom"
このようにoutputTextに新しい行を追加すると
outputText.append("\n"+"New text line.");
自動的に最後の行までスクロールしますが、これらはすべてあなたの必要に応じた魔法です。
これらの答えはどれも私が望んでいたものではなかったので、私はこれを思いつきました。
textView.append(log);
while (textView.canScrollVertically(1)) {
textView.scrollBy(0, 10);
}
スクロールする前に移動方法を設定することを忘れないでください
textView.setMovementMethod(new ScrollingMovementMethod());
同じ質問がありました。これと同様の議論からいくつかの決定を試みましたが、何もうまくいきませんでした。このように解決しました:
_edtConsoleText.setSelection(edtConsoleText.getText().length());
_
すべての.append()
の後。
次の2つのソリューションで試すことができます。
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>
カスタムスクロール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 )
「 アクティビティの起動時にScrollViewの一番下までスクロールする方法 」から:
_final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview)); scrollview.post(new Runnable() { @Override public void run() { scrollview.fullScroll(ScrollView.FOCUS_DOWN); } });
_
必要なのは、追加操作の後にfullScroll()
を配置することです。
Xmarinを使用しています。
私の解決策は、多くの人が言ったように、ScrollView内のtextViewです。
ビューの下部に新しい行を表示する場合は、使用します
Android:layout_gravity="bottom"
これにより、ビューをスクロールするまで新しい行が下部に保持されます。ビューは、スクロールした場所にとどまります。
コードは必要ありません。
ただし、追加後にコンテンツを常に一番下にしたい場合は、append()の後にコードを追加する必要があります。
myText.Append(...);
myscroll.FullScroll(FocusSearchDirection.Down);
私にとっては、これら2つの組み合わせを除いて完璧に機能するものはありませんでした:-
scroller.scrollTo(0, 70);
を設定します。textviewを設定する前に、Stringを追加した後に使用します。52dpは私のデバイスの高さです。 .getBottom());そこで、スクロールビューの調整に70を使用しました。Android:scrollY="30dp"
あなたのテキストビューで。