使TextView在Android上可滚动


771

我在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);

Answers:


1718

您不需要ScrollView实际使用。

只需设置

android:scrollbars = "vertical"

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

然后使用:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

在您的代码中。

宾果游戏,滚动!


96
但肯定maxLines需要您输入一个任意数字;这不是适用于所有屏幕尺寸和字体大小的东西吗?我发现仅用包裹起来就更简单了ScrollView,这意味着我不必添加任何其他XML属性或代码(例如设置移动方法)。
Christopher Orr 2010年

12
@ Christopher,ScrollView也需要'android:layout_height'。
Regex Rookie

11
@Regex:是的。您要么让它ScrollView占用所需的空间(例如通过android:fillViewport属性),要么设置所需的特定大小。maxLines不应使用using 来设置UI元素的大小,因此这不是解决方案。
Christopher Orr

62
您不需要定义maxlines。其余的。
Stevanicus 2011年

13
要弄清楚每个人对“平滑”滚动的说法:如果使用此方法,滚动实际上是“平滑”的(因为您可以逐像素滚动),但这并不是动态的。松开手指后,它立即停止滚动-不会滑动。这对于现代UI来说是完全不能接受的,因此我将编辑答案以确保其他人不会在此“解决方案”上浪费时间。
Timmmm 2015年

310

这就是我纯粹用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>

笔记:

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

  2. 定义Scrollview时,请勿指定,android:layout_height="fill_parent"否则滚动视图将无法正常工作!(这使我刚才浪费了一个小时!FFS)。

专家提示:

要在添加文本后以编程方式滚动到底部,请使用以下命令:

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

12
无需使用mTextView.getBottom(),只需使用该方法,mScrollView.fullScroll(View.FOCUS_DOWN)因为它是ScrollView API的一部分。有关更多信息,请参见此处此处
ChuongPham 2013年

7
Android警告在该示例中,LinearLayoutScrollView可能无用(我LinearLayout完全删除了)。它还警告说,TextView应该android:layout_height="wrap_content"匹配ScrollView。这些警告可能是由于自发布此答案以来已经过去了3年。无论如何,此答案都支持平滑滚动和轻拂... + 1
skia.heliou 2014年

在xml文件中的<!--suppress AndroidLintUselessParent -->上方添加ScrollView将处理这些警告。
Louie Bertoncin 2015年

在Android API级别9中,“专业提示”不适用于我。添加文本后,textview仍滚动到顶部。
LarsH '16

使用可接受的答案方法将不会产生流畅的用户体验,因此这种方法更好。
seyedrezafar

120

真正必要的是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);
    }
}

3
有什么方法可以在XML中设置此属性?我不知道为什么他们会放弃这种选择。
Thalur 2011年

它可以工作,但是滚动后是否可以通过任何方式刷新它?我的意思是,在滚动TextView之后,我将更改其上的文本,但是即使不需要它,其位置仍保持滚动状态。它的bcose以前我已经应用了滚动...
Nirav Dangi

9
没有滚动条,并且与该ScrollView方法相比滚动笨拙。
杰弗里·布拉特曼

1
用... StringBuilder代替String...您所拥有的有点浪费。
亚历克斯·洛克伍德

4
这可行,但滚动不流畅。仍然可以工作,尽管谢谢。
frostymarvelous


41

不必放入

android:Maxlines="AN_INTEGER"`

您只需添加以下内容即可完成工作:

android:scrollbars = "vertical"

然后,将以下代码放入您的Java类中:

textview.setMovementMethod(new ScrollingMovementMethod());

解决方案比公认的解决方案好得多,因为滚动条的大小恰好适合文本,而且您不会浪费空间。
FractalBob

当我将ScrollView用作父级时,该时间不起作用
Prince

27

你可以

  1. 围绕TextView由一个ScrollView; 要么
  2. 将移动方法设置为ScrollingMovementMethod.getInstance();

22

我发现的最好方法:

使用具有以下这些额外属性的EditText替换TextView:

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

不需要包装在ScrollView中。


2
最好的方法是最合适的答案,尤其是考虑到EditText是TextView子类,而问题是如何使textview可滚动,而不是如何解决此问题。如果可以的话,我会投票两次:)
贾斯汀·布瑟

4
@JustinBuser无法不同意。:)这完全是偶然的,并且不能保证它将在将来的Android版本中使用。如果要滚动,请使用Android提供的滚动工具。 ScrollView是正确的方法。
Madbreaks 2012年

1
@Madbreaks没有什么“偶然的”之处,EditText是一个TextView,具有一些添加的方法和替代,这些方法和替代是专门为适应不同长度的文本而定制的。特别是EditText会覆盖TextView getDefaultMovementMethod函数的返回值。默认实现返回NULL,EditText基本上会完成所有其他所有其他提示所建议的操作。就使用Android提供的工具而言,与这些答案中发现的任何其他方法相比,不推荐使用EditText类。
贾斯汀·布什

4
你根据的EditText的默认行为,@JustinBuser我的问题,虽然是是我的意思很可能改变的道路(不是所有的EditText将被弃用)。您可以争辩说,但同样,您的想法是使用适合手头任务的组件和功能。ScrollView被明确设计为包含滚动。我总是尝试并且总是建议其他人使用正确的工具来完成这项工作。对于给定的编程问题,几乎总是有多种方法。无论如何,感谢您的深思熟虑。
Madbreaks 2012年

16

简单。这是我的方法:

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

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

奖金:

要使文本视图在文本填充时向下滚动,您必须添加:

    android:gravity="bottom"

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

当然,您需要使用append函数而非设置文本来添加文本:

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

我将其用于日志目的。

我希望这有帮助 ;)


14

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

首先,您需要在main.xml文件中使用一个Textview控件,并在其中写入一些文本……如下所示:

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

而已...


6
为什么还要写这个?这是在您撰写答案之前的6个月内发布的答案,几乎完全相同,尽管不太正确。
贾斯汀·

11

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

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

启用蓝色动画。IMO的最佳答案。
Griffin W.

11

上面“某人某处”(使TextView在Android上可滚动)的“专业提示” 效果很好,但是,如果您正在向ScrollView动态添加文本,并且当用户位于ScrollView的底部?(也许是因为如果用户向上滚动以阅读某些内容,则您不想在附加过程中自动重置到底部,这很烦人。)

无论如何,这里是:

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

mTextStatus.getLineHeight()将使它成为可能,以便如果用户位于ScrollView末尾的一行之内,则不会滚动到ToBottom()。


10

如果要在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"
 />

而已。


7

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

android:scrollbars="vertical"

最后,添加

textView.setMovementMethod(new ScrollingMovementMethod());

在Java文件中。


1
这不会进行动力学滚动。不要使用它。
Timmmm 2015年

6

我没有找到TextView滚动来支持“翻转”手势,该手势在向上或向下滑动后仍继续滚动。我最终自己实现了它,因为出于各种原因我不想使用ScrollView,而且似乎没有MovementMethod允许我选择文本并单击链接。


6
如此...您是如何添加猛击手势的?
Lou Morda 2014年

6

在Kotlin中,用于使textview可滚动

myTextView.movementMethod= ScrollingMovementMethod()

并在xml中添加此属性

    android:scrollbars = "vertical"

5

当完成可滚动操作后,在视图中输入任何内容时,请将此行添加到视图的最后一行:

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

dude,tablescroller是一个视图,该视图由XML的id属性标识,该XML在..中进行了处理。您只需尝试一下..它将可以正常工作..它的工作原理..
Rahul Baradia

4

如果您不想使用EditText解决方案,那么以下方法可能会更好:

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

4

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

2
这不会进行动力学滚动。不要使用它。
Timmmm 2015年

我不想省略结尾文本。我该怎么做。
Sagar Nayak

@SagarNayak使用android:ellipsize =“ none”
Francis

2

下面的代码创建一个自动水平滚动textview:

在将TextView添加到xml时使用

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

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

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



0

就我而言,约束布局,AS 2.3。

代码实现:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

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

0

我为此奋斗了一个多星期,终于弄清楚了如何使它工作!

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

到目前为止,这是最简单的解决方案:

在包中创建一个名为“ 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;
    }
}

最后,以XML更改“ TextView”:

从: <TextView

至: <com.your_app_goes_here.PerfectScrollableTextView


1
100%完美答案。我遇到了与您在说明中提到的相同的问题。应用许多解决方案,但效果并不理想。但您的解决方案在每种情况下均能完美运行。节省我的时间的人:)谢谢
Daxesh Vekariya

@DaxeshVekariya很高兴为您工作!
Petro

0

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


0

我当我使用了这个问题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;
            }
        });

0

每当需要使用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

您的问题将得到解决


0

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

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

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

Prigramacaly- setHorizontallyScrolling(boolean)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.