Как я могу сделать 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
Ответы
Ответ 1
В соответствии с ответом здесь Создание прокрутки TextView в Android
Вам действительно не нужно использовать ScrollView.
Просто установите
android:maxLines = "AN_INTEGER"
android: scrollbars = "vertical" свойства вашего TextView в вашем XML файле макета.
Затем используйте:
yourTextView.setMovementMethod(new ScrollingMovementMethod());
в вашем коде.
Это сработает.
Ответ 2
Из вашего кода необходимо выполнить два шага:
Шаг 1
Хотя вы код в Xamarin Android, но, как и в Java в xxxActivity.java для terminalOutput, вызов должен быть таким
TextView outputText = (TextView) findViewById(R.id.terminalOutput);
outputText.setMovementMethod(new ScrollingMovementMethod());
Метод setMovementMethod() параметром ScrollingMovementMethod() - это трюк.
Шаг 2
И в макете, как в Java-Android, также в activity_xxx.xml для декларации TextView, как указано выше, необходимо добавить этот
android:gravity="bottom"
Когда вы добавляете новую строку в outputText, как этот
outputText.append("\n"+"New text line.");
Он будет автоматически прокручиваться до последней строки, и все это волшебство для ваших нужд.
Ответ 3
Был тот же вопрос. Пробовал несколько решений из этого и подобных обсуждений, ничего не получилось. Решилось так:
edtConsoleText.setSelection(edtConsoleText.getText().length());
после каждого .append()
.
Ответ 4
Вы можете попробовать в 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 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 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
От "Как прокрутить вниз в ScrollView при запуске активности":
final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
@Override
public void run() {
scrollview.fullScroll(ScrollView.FOCUS_DOWN);
}
});
Вам нужно поставить fullScroll()
после операции добавления.
Ответ 6
Я использую Xmarin.
Мое решение так много упоминалось, чтобы textView внутри ScrollView.
Если вы хотите увидеть новую строку в нижней части представления, используйте
android:layout_gravity="bottom"
Это удерживает новую строку внизу, пока вы не прокрутите представление. Вид остается там, где вы прокручиваете.
Не требуется код.
Однако, если вы хотите, чтобы содержимое было всегда внизу после добавления, вам нужно добавить код после append():
myText.Append(...);
myscroll.FullScroll(FocusSearchDirection.Down);
Ответ 7
Ни один из этих ответов не был тем, чего я хотел, поэтому я придумал это.
textView.append(log);
while (textView.canScrollVertically(1)) {
textView.scrollBy(0, 10);
}
Не забудьте установить метод перемещения перед прокруткой
textView.setMovementMethod(new ScrollingMovementMethod());
Ответ 8
Вы можете сделать что-то вроде:
// When adding text
mTextView.scrollTo(0, Integer.MAX_VALUE);
Это должно привести к снижению, но также позволит пользователю прокручивать резервные копии, если они захотят.
Вам также необходимо автоматически определять, когда вы добавляете текст?