Создание прокрутки TextView на Android
Я показываю текст в текстовом виде, который кажется слишком длинным, чтобы соответствовать
в один экран. Мне нужно сделать прокручиваемым 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);
Ответы
Ответ 1
Вам действительно не нужно использовать ScrollView
.
Просто установите
android:maxLines = "AN_INTEGER"
android:scrollbars = "vertical"
свойства вашего TextView
в вашем XML файле макета.
Затем используйте:
yourTextView.setMovementMethod(new ScrollingMovementMethod());
в вашем коде.
Бинго, он прокручивается!
Ответ 2
Вот так я сделал это исключительно в 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>
ПРИМЕЧАНИЯ:
-
android:fillViewport="true"
в сочетании с android:layout_weight="1.0"
сделает textview занятым все свободное пространство.
-
При определении Scrollview НЕ указывайте android:layout_height="fill_parent"
, иначе прокрутка не работает! (это заставило меня потратить час только сейчас! FFS).
PRO СОВЕТ:
Чтобы программно прокручивать нижнюю часть после добавления текста, используйте это:
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());
}
});
}
Ответ 3
Все, что действительно необходимо, это 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);
}
}
Ответ 4
Сделайте свой текст просто добавлением этого
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
Ответ 5
Вы можете либо
- окружает
TextView
на ScrollView
; или
- установите для параметра "Движение" значение
ScrollingMovementMethod.getInstance();
.
Ответ 6
Нет необходимости вставлять
android:Maxlines="AN_INTEGER"`
Вы можете сделать свою работу, просто добавив:
android:scrollbars = "vertical"
И, поместите этот код в свой класс Java:
textview.setMovementMethod(new ScrollingMovementMethod());
Ответ 7
Лучший способ найти:
Замените TextView на EditText этими дополнительными атрибутами:
android:background="@null"
android:editable="false"
android:cursorVisible="false"
Нет необходимости в обертке в ScrollView.
Ответ 8
Это "Как применить ScrollBar к TextView", используя только XML.
Сначала вам нужно взять элемент управления Textview в файле main.xml и записать в него текст... например:
<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>
Что это...
Ответ 9
"Про подсказку" выше от Someone Somewhere (Прокрутка TextView с прокруткой на Android) отлично работает, однако, если вы динамически добавляете текст в ScrollView и хотел бы автоматически прокручивать нижнюю часть после добавления только тогда, когда пользователь находится в нижней части ScrollView? (Возможно, потому что, если пользователь прокручивается, чтобы читать что-то, вы не хотите автоматически reset снижаться во время добавления, что было бы неприятно.)
В любом случае, вот оно:
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
(mScrollView.getHeight() + mTextStatus.getLineHeight())) {
scrollToBottom();
}
mTextStatus.getLineHeight() сделает так, чтобы вы не прокручивалиToBottom(), если пользователь находится в одной строке от конца ScrollView.
Ответ 10
Это обеспечит плавный прокручивание текста с помощью полосы прокрутки.
ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
Ответ 11
Если вы хотите, чтобы текст был прокручен в текстовом виде, вы можете выполнить следующие действия:
Сначала вам нужно подклассы 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"
/>
Что это.
Ответ 12
Simple. Вот как я это сделал:
-
Сторона 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>
-
Сторона Java:
tv_log = (TextView) findViewById(R.id.tv_log);
tv_log.setMovementMethod(new ScrollingMovementMethod());
Бонус:
Чтобы текстовое представление прокручивалось вниз, когда текст заполнил его, вы должны добавить:
android:gravity="bottom"
в текстовый файл TextView. Он будет автоматически прокручиваться по мере поступления большего количества текста.
Конечно, вам нужно добавить текст, используя функцию append вместо заданного текста:
tv_log.append("\n" + text);
Я использовал его для целей журнала.
Я надеюсь, что это поможет;)
Ответ 13
Я не нашел прокрутку TextView для поддержки жестов "fling", где он продолжает прокручиваться после щелчка вверх или вниз. Я закончил это сам, потому что не хотел использовать ScrollView по разным причинам, и, похоже, не было MovementMethod, и я разрешил мне выбирать текст и нажимать на ссылки.
Ответ 14
Когда вы закончите с помощью прокрутки, добавьте эту строку в последнюю строку просмотра, когда вы вводите что-либо в виде:
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
Ответ 15
Добавьте это в свой 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());
Ответ 16
Добавьте в текстовое представление в XML следующее.
android:scrollbars="vertical"
И, наконец, добавьте
textView.setMovementMethod(new ScrollingMovementMethod());
в файле Java.
Ответ 17
Если вы не хотите использовать решение EditText, вам может быть повезло с:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLayout);
(TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}
Ответ 18
В приведенном ниже коде создается автоматический горизонтальный прокручиваемый текст:
При добавлении TextView в xml используйте
<TextView android:maxLines="1"
android:ellipsize="marquee"
android:scrollHorizontally="true"/>
Задайте следующие свойства TextView в onCreate()
tv.setSelected(true);
tv.setHorizontallyScrolling(true);
Ответ 19
Я боролся с этим больше недели и, наконец, понял, как сделать эту работу!
Моя проблема заключалась в том, что все будет прокручиваться как "блок". Сам текст прокручивался, а скорее как фрагмент, а не по строкам. Это явно не сработало для меня, потому что оно обрезало бы линии внизу. Все предыдущие решения не работали для меня, поэтому я создал свои собственные.
Вот самое легкое решение:
Сделайте файл класса с именем: "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;
}
}
Наконец, измените свой "TextView" в XML:
От: <TextView
To: <com.your_app_goes_here.PerfectScrollableTextView
Ответ 20
Используйте его так:
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines = "AN_INTEGER"
android:scrollbars = "vertical
/>
Ответ 21
В моем случае. Contrastint Layout.AS 2.3.
Исполнение кода:
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());
XML:
android:scrollbars="vertical"
android:scrollIndicators="right|end"