Сделать виджет TextView с прокруткой на Андроид
Я показываю текст в textview, который кажется слишком длинным, чтобы соответствовать
на один экран. Мне нужно сделать мой виджет 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);
24 ответов:
вам не нужно использовать
ScrollViewна самом деле.просто установить
android:scrollbars = "vertical"свойства
TextViewв xml-файле вашего макета.затем использовать:
yourTextView.setMovementMethod(new ScrollingMovementMethod());в коде.
Бинго, он прокручивает!
вот как я сделал это чисто в 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"в противном случае scrollview не работает! (это заставило меня потратить час только что! ФФС.)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()); } }); }
все, что действительно необходимо, это setMovementMethod(). Вот пример использования LinearLayout.
File главная.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>File 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); } }
сделайте свой textview просто добавив Это
TextView textview= (TextView) findViewById(R.id.your_textview_id); textview.setMovementMethod(new ScrollingMovementMethod());
не надо вставлять
android:Maxlines="AN_INTEGER"`вы можете сделать свою работу, просто добавив:
android:scrollbars = "vertical"и поместите этот код в свой класс Java:
textview.setMovementMethod(new ScrollingMovementMethod());
вы можете
- вокруг
TextViewнаScrollView; или- установите метод перемещения в
ScrollingMovementMethod.getInstance();.
лучший способ, который я нашел:
замените TextView на EditText с этими дополнительными атрибутами:
android:background="@null" android:editable="false" android:cursorVisible="false"нет необходимости обертывать в ScrollView.
Это "как применить полосу прокрутки к вашему TextView", используя только XML.
во-первых, вам нужно взять элемент управления Textview в главная.xml файл и написать в него текст ... вот так:
<TextView android:id="@+id/TEXT" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/long_text"/>затем поместите элемент управления вид текста между scrollview для отображения полосы прокрутки для этого текста:
<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>вот именно...
простой. Вот как я это сделал:
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"в xml-файл TextView. Он будет прокручиваться вниз автоматически, как больше текста приходит.
конечно, вам нужно добавить текст с помощью функции добавления вместо набора текст:
tv_log.append("\n" + text);я использовал его для журнала.
надеюсь, это поможет;)
"pro tip" выше от кого-то где-то ( создание TextView прокручивается на Android) отлично работает, однако, что делать, если вы динамически добавляете текст в ScrollView и хотели бы автоматически прокручивать вниз после добавления только когда пользователь находится в нижней части ScrollView? (Возможно, потому, что если пользователь прокрутил вверх, чтобы прочитать что-то, что вы не хотите автоматически сбрасывать вниз во время добавления, что было бы раздражающий.)
в любом случае, вот это:
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <= (mScrollView.getHeight() + mTextStatus.getLineHeight())) { scrollToBottom(); }mTextStatus.getLineHeight() сделает это так, что вы не scrollToBottom (), если пользователь находится в пределах одной строки от конца ScrollView.
Это обеспечит плавную прокрутку текста с полосой прокрутки.
ScrollView scroller = new ScrollView(this); TextView tv = new TextView(this); tv.setText(R.string.my_text); scroller.addView(tv);
Если вы хотите, чтобы текст прокручивался в textview, то вы можете следовать следующему:
сначала вы должны иметь подкласс 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" />вот именно.
Я не нашел прокрутки TextView для поддержки жеста "бросок", где он продолжает прокрутку после щелчка вверх или вниз. Я в конечном итоге реализовал это сам, потому что я не хотел использовать ScrollView по разным причинам, и, похоже, не было MovementMethod, который позволял мне выбирать текст и нажимать на ссылки.
добавьте следующее в textview в XML.
android:scrollbars="vertical"и, наконец, добавить
textView.setMovementMethod(new ScrollingMovementMethod());в файле Java.
когда вы закончите с прокруткой, добавьте эту строку в последнюю строку представления, когда вы вводите что-либо в представлении:
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
добавьте это в свой 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());
Если вы не хотите использовать решение EditText, то вам может повезти с:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.yourLayout); (TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance()); }
приведенный ниже код создает автоматическую горизонтальную прокрутку textview:
при добавлении TextView в xml используйте
<TextView android:maxLines="1" android:ellipsize="marquee" android:scrollHorizontally="true"/>установите следующие свойства TextView в onCreate ()
tv.setSelected(true); tv.setHorizontallyScrolling(true);
используйте его так
<TextView android:layout_width="match_parent" android:layout_height="match_parent" android:maxLines = "AN_INTEGER" android:scrollbars = "vertical" />
в моем случае.Макет Ограничения.В качестве 2.3.
код реализации:
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());XML:
android:scrollbars="vertical" android:scrollIndicators="right|end"
я боролся с этим в течение недели и, наконец, придумал, как сделать эту работу!
моя проблема заключалась в том, что все будет прокручиваться как "блок". Сам текст прокручивался, но как кусок, а не строка за строкой. Это, очевидно, не сработало для меня, потому что это отрезало бы линии внизу. Все предыдущие решения не работали для меня, поэтому я создал свой собственный.
вот самое простое решение на сегодняшний день:
создать файл класса с именем: '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:
от:
<TextViewTo:
<com.your_app_goes_here.PerfectScrollableTextView
поставить
maxLinesиscrollbarsвнутри TextView в xml.<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());
у меня была эта проблема, когда я использовал
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; } });
всякий раз, когда вам нужно используйте ScrollView в качестве родителя, и вы также используете метод перемещения прокрутки с TextView.
и портрет для ландшафтного устройства, что время происходят некоторые проблемы. (например) вся страница прокручивается, но метод перемещения прокрутки не может работать.
Если вам все еще нужно использовать ScrollView в качестве родителя или метод перемещения прокрутки, то вы также используете ниже desc.
Если у вас нет никаких проблем затем вы используете EditText вместо TextView
см. ниже :
<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
и ваш вопрос будет решен
Comments