Создание прокрутки TextView на Android
я отображаю текст в 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.
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);
}
}
сделайте свой 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 в main.в XML файл и записать в него текст ... вот так:
<TextView
android:id="@+id/TEXT"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/long_text"/>
затем поместите элемент управления text view между 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>
вот именно...
простой. Вот как я это сделал:--5-->
-
сторона 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. Он будет прокручиваться вниз автоматически, как больше текста приходит.
конечно, вам нужно добавить текст с помощью функции append вместо set текст:
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:
From:<TextView
В: <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
и ваша проблема будет решена