在Android上使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);
688154 次浏览

你也可以

  1. ScrollView包围TextView;或者
  2. 将移动方法设置为ScrollingMovementMethod.getInstance();

实际上,你不需要使用ScrollView

只要设置

android:scrollbars = "vertical"

TextView在布局的xml文件中的属性。

然后使用:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

在您的代码中。

宾果,它滚动!

真正需要的是setMovementWay()。这是一个使用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"><TextViewandroid: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. */@Overridepublic 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滚动来支持“投掷”手势,在向上或向下轻弹后继续滚动。我最终自己实现了这一点,因为出于各种原因我不想使用ScrollView,而且似乎没有一个MovementWay允许我选择文本和单击链接。

这就是我在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">
<ScrollViewandroid:id="@+id/SCROLLER_ID"android:layout_width="fill_parent"android:layout_height="wrap_content"android:scrollbars="vertical"android:fillViewport="true">
<TextViewandroid:id="@+id/TEXT_STATUS_ID"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1.0"/></ScrollView></LinearLayout>

注:

  1. android:fillViewport="true"android:layout_weight="1.0"结合将使文本视图占用所有可用空间。

  2. 定义滚动视图时,不要指定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());}});}

我发现的最好的方法:

将TextView替换为具有以下额外属性的EditText:

android:background="@null"android:editable="false"android:cursorVisible="false"

不需要在ScrollView中包装。

这是“如何将ScrollBar应用于您的TextView”,仅使用XML。

首先,您需要在main.xml文件中获取一个Textview控件并将一些文本写入其中……像这样:

<TextViewandroid: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">
<ScrollViewandroid:id="@+id/ScrollView01"android:layout_height="150px"android:layout_width="fill_parent">
<TextViewandroid:id="@+id/TEXT"android:layout_height="wrap_content"android:layout_width="wrap_content"android:text="@string/long_text"/>
</ScrollView></RelativeLayout>

就是这样…

当你完成scrollable时,当你在视图中输入任何内容时,将这一行添加到视图的最后一行:

((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);

如果您不想使用EditText解决方案,那么您可能会有更好的运气:

@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.yourLayout);(TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());}

这将提供带有滚动条的平滑滚动文本。

ScrollView scroller = new ScrollView(this);TextView tv = new TextView(this);tv.setText(R.string.my_text);scroller.addView(tv);

如果您希望文本在文本视图中滚动,那么您可以按照以下操作:

首先,您应该子类化文本视图。

然后使用它。

下面是一个子类文本视图的示例。

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);}
@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {if(focused)super.onFocusChanged(focused, direction, previouslyFocusedRect);}
@Overridepublic void onWindowFocusChanged(boolean focused) {if(focused)super.onWindowFocusChanged(focused);}
@Overridepublic boolean isFocused() {return true;}}

现在,您必须以这种方式在XML中使用它:

 <com.yourpackagename.AutoScrollableTextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="This is very very long text to be scrolled"/>

就这样了。

上面来自某个地方的“专业提示”(在Android上使TextView可滚动)效果很好,但是,如果您正在动态向ScrollView添加文本,并希望在用户位于ScrollView底部时自动滚动到追加只有之后的底部,该怎么办?(也许是因为如果用户向上滚动以阅读某些内容,您不想在追加期间自动重置为底部,这会很烦人。

不管怎样,这里是:

if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=(mScrollView.getHeight() + mTextStatus.getLineHeight())) {scrollToBottom();}

如果用户在ScrollView末尾的一行内,mTextStatus.getLineHeight()将使您不会滚动lToBottom()。

使您的文本视图只需添加此

TextView textview= (TextView) findViewById(R.id.your_textview_id);textview.setMovementMethod(new ScrollingMovementMethod());

将其添加到您的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());

在XML中的文本视图中添加以下内容。

android:scrollbars="vertical"

最后,添加

textView.setMovementMethod(new ScrollingMovementMethod());

在Java文件中。

我为此奋斗了一个多星期,终于想出了如何使这项工作!

我的问题是所有内容都会以“块”的形式滚动。文本本身正在滚动,但作为一个块而不是一行一行地滚动。这显然对我不起作用,因为它会切断底部的线条。之前的所有解决方案都不适合我,所以我自己制作了。

这是迄今为止最简单的解决方案:

在一个包中创建一个名为:'完美ScrollableTextView'的类文件,然后将此代码复制并粘贴到:

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);}
@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {if(focused)super.onFocusChanged(focused, direction, previouslyFocusedRect);}
@Overridepublic void onWindowFocusChanged(boolean focused) {if(focused)super.onWindowFocusChanged(focused);}
@Overridepublic boolean isFocused() {return true;}}

最后更改XML中的“TextView”:

来自:<TextView

到:<com.your_app_goes_here.PerfectScrollableTextView

很简单。我是这样做的:

  1. 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"><TextViewandroid:id="@+id/tv_log"android:layout_width="match_parent"android:layout_height="wrap_content"android:scrollbars="vertical"android:text="Log:" /></RelativeLayout>
  2. Java side:

    tv_log = (TextView) findViewById(R.id.tv_log);tv_log.setMovementMethod(new ScrollingMovementMethod());

Bonus:

To let the text view scroll down as the text fill it, you have to add:

    android:gravity="bottom"

到TextView xml文件。随着更多文本的进入,它将自动向下滚动。

当然,您需要使用append函数而不是set text来添加文本:

    tv_log.append("\n" + text);

我把它用于日志目的。

希望对你有帮助;)

没必要放进去

android:Maxlines="AN_INTEGER"`

您可以通过简单地添加:

android:scrollbars = "vertical"

然后,把这段代码放在你的Java类中:

textview.setMovementMethod(new ScrollingMovementMethod());

下面的代码创建一个自动水平滚动文本视图:

将TextView添加到xml时使用

<TextView android:maxLines="1"android:ellipsize="marquee"android:scrollHorizontally="true"/>

在onCreate()中设置TextView的以下属性

tv.setSelected(true);tv.setHorizontallyScrolling(true);

像这样使用它

<TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:maxLines = "AN_INTEGER"android:scrollbars = "vertical"/>

对我来说约束Layout.AS2.3

代码实现:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

android:scrollbars="vertical"android:scrollIndicators="right|end"

maxLinesscrollbars放在xml中的TextView中。

<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());

当我在ScrollView中使用TextView时遇到了这个问题。这个解决方案对我很有效。

scrollView.setOnTouchListener(new View.OnTouchListener() {
@Overridepublic boolean onTouch(View v, MotionEvent event) {
description.getParent().requestDisallowInterceptTouchEvent(false);
return false;}});
description.setOnTouchListener(new View.OnTouchListener() {
@Overridepublic boolean onTouch(View v, MotionEvent event) {
description.getParent().requestDisallowInterceptTouchEvent(true);
return false;}});

每当您需要使用ScrollView作为父时,您还可以使用TextView的滚动移动方法。

当你纵向景观您的设备,时间发生一些问题.(喜欢)整个页面是可滚动的,但滚动移动方法不能工作。

如果您仍然需要使用ScrollView作为父方法或滚动移动方法,那么您还可以使用下面的desc。

如果您没有任何问题,则使用EditText而不是TextView

见下文:

<EditTextandroid: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

你的问题就解决了

XML-您可以使用android:scrollHorizontally属性

是否允许文本比视图更宽(因此可以水平滚动)。

可以是布尔值,例如“true”或“false”。

Prigramacaly-setHorizontallyScrolling(boolean)

试试这个:

android:scrollbars = "vertical"

在kotlin中使文本视图可滚动

myTextView.movementMethod= ScrollingMovementMethod()

并在xml中添加此属性

    android:scrollbars = "vertical"
yourtextView.setMovementMethod(new ScrollingMovementMethod());

你现在可以滚动它。

对于垂直水平可滚动的TextView,其他一些答案会有所帮助,但我需要能够双向滚动。

最终起作用的是一个带有HorizontalScrollView的ScrollView,以及HSV内的TextView。它非常流畅,可以轻松地在一次滑动中从一边到另一边或从上到下。它还一次只允许在一个方向上滚动,所以在向上或向下滚动时没有任何跳跃。

一个编辑和光标禁用的EditText可以工作,但感觉很糟糕。每次滚动尝试都会移动光标,即使在大约100行的文件中,也需要多次滑动才能从上到下或左右移动。

使用setHorizontallyScrolling(true)可以工作,但是没有类似的方法允许垂直滚动,而且据我所知,它在ScrollView中不起作用(只是学习,可能是错误的)。

如果你使用静态编程语言,这样:XML

 <TextViewandroid:id="@+id/tvMore"android:layout_width="match_parent"android:layout_height="wrap_content"android:maxLines="3"android:scrollbars="vertical" />

活动

tvMore.movementMethod = ScrollingMovementMethod()

我知道这是一个较旧的帖子,但这就是我在Java方面处理这个问题的方式。

    // Allow textView to scrolltv.setSingleLine(true);tv.setHorizontallyScrolling(true);tv.setEllipsize(TextUtils.TruncateAt.MARQUEE);tv.setMarqueeRepeatLimit(-1); // Infinite// TextView must be 'selected'tv.setSelected(true);// Padding not necessary, but this helps so the text isn't right// up against the side of a screen/layouttv.setPadding(10, 0, 10, 0);

以下是JetPack Compose精彩而快乐的世界中的答案:

LazyColumn {item {Text(text = "My Long Text")}}