使TextView在Android上可滚动

Muh*_*man 736 android scroll 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);
Run Code Online (Sandbox Code Playgroud)

Ami*_*war 1629

你不需要ScrollView实际使用.

只需设置

android:scrollbars = "vertical"
Run Code Online (Sandbox Code Playgroud)

TextView布局的xml文件中的属性.

然后使用:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

在你的代码中.

宾果,滚动!

  • 但肯定``maxLines`要求你输入一个任意数字; 这不是适用于每种屏幕尺寸和字体大小的东西吗?我发现用`ScrollView`包装它更简单,这意味着我不需要添加任何进一步的XML属性或代码(比如设置移动方法). (94认同)
  • 你不需要定义最大线.其余的. (61认同)
  • 澄清大家对"平滑"滚动的看法:如果你使用这种方法,滚动实际上是"平滑的"(因为你可以逐个像素地滚动),但它不是*动态的.一旦你移开你的手指它立即停止滚动 - 没有轻弹.这对于现代用户界面来说是非常不可接受的,因此我将编辑答案以确保其他人不会在这个"解决方案"上浪费时间. (12认同)
  • @Christopher,ScrollView也需要'android:layout_height'. (11认同)
  • @Regex:是的.您可以让`ScrollView`占用尽可能多的空间(例如通过`android:fillViewport`属性),或者设置您想要的特定大小.使用`maxLines`不应该用于设置UI元素的大小,因此这不是解决方案. (11认同)
  • @ubuntudroid有必要添加这个方法.如果您的文字较大,则文本视图如果不滚动. (5认同)
  • 这实际上是最好和最简单的答案:)这是等效的编程:text.setMaxLines(4); text.setVerticalScrollBarEnabled(真); text.setHorizo​​ntalScrollBarEnabled(真); text.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); text.setMovementMethod(new ScrollingMovementMethod()); (4认同)
  • 看起来你必须用`ScrollView`包围`TextView`才能顺利滚动. (3认同)
  • 你好.对我来说,这不是一个解决方案(正如我所想的那样).我必须在这里以编程方式创建所有布局,当使用带有ScrollMovementMethod()的TextView时,它会像3 px/scroll一样滚动并且非常生涩.此TextView位于ScraView中的LineraLayout中.当我尝试用另一个ScrollView包围这个TextView时 - 如何设置它的高度??? 记住 - 我这里没有使用任何XML ...... ScrollView没有`.setHeight()`方法.有什么建议吗? (2认同)
  • 你甚至不必做TextView.setMovementMethod(..)的东西;),设置android:scrollbars实际上已经足够了. (2认同)
  • @Christopher:设置`android:maxLines`是没有必要的. (2认同)
  • 滚动不顺畅.怎么实现呢? (2认同)
  • @Timmmm答案已经被接受804次。因此,这种行为对于大多数开发人员来说都是可以接受的。在问答中无处提及动力学滚动。您不应该仅仅因为答案不符合要求而编辑答案。我认为您发表的评论足够好。 (2认同)
  • 动态滚动是一个隐含的要求。我编辑了这个问题,因为您必须向下滚动许多措辞含糊的评论才能发现它不支持动态滚动。Shadyyx、Matt Logan、Pratik Butani、Deb、Nishit Shah 和 Simas 都指出这不可能没有问题——我相信他们会欣赏我的编辑。有人在某处的答案是最好的(并且它有很多赞成票),但由于某种原因,它在页面的下方)。 (2认同)
  • TextView的滚动器不如ScrollView中的那么快。我尝试了此解决方案,然后转移到@Someone Somewhere的解决方案。 (2认同)

Som*_*ere 304

这就是我纯粹用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>
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  2. 定义Scrollview时,请勿指定android:layout_height="fill_parent"scrollview不起作用!(这导致我现在浪费了一个小时!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());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 滚动性能比接受的答案好得多. (18认同)
  • 没有必要使用`mTextView.getBottom()`,只需使用方法`mScrollView.fullScroll(View.FOCUS_DOWN)`,因为它是ScrollView API的一部分.见[here](http://developer.android.com/reference/android/widget/ScrollView.html#fullScroll%28int%29)和[here](http://developer.android.com/reference/android/ view/View.html#FOCUS_DOWN)了解更多信息. (12认同)
  • Android警告说,在这个例子中,`LinearLayout`或`ScrollView`可能没用(我完全删除了`LinearLayout`).它还警告说,对于`TextView`,它应该是`android:layout_height ="wrap_content"`来匹配`ScrollView`.这些警告可能是由于自该答案发布以来已过去3年.无论如何,这个答案支持平滑滚动和轻弹...... + 1 (7认同)

Edd*_*ieB 119

所有真正必要的是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>
Run Code Online (Sandbox Code Playgroud)

文件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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没有滚动条,与"ScrollView"方法相比,滚动很笨重. (8认同)
  • 这工作但滚动不顺畅.仍然有效,但谢谢. (4认同)
  • 有没有办法在XML中设置此属性?我想知道为什么他们会忽略这个选择. (3认同)

mat*_*soy 45

让你的textview添加这个

TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
Run Code Online (Sandbox Code Playgroud)

  • 这不会动态滚动.不要使用它. (14认同)
  • @Timmmm如何获得动能卷轴? (3认同)
  • 您不希望对必须阅读的文本进行“动态滚动”。 (2认同)

小智 38

没有必要投入

android:Maxlines="AN_INTEGER"`
Run Code Online (Sandbox Code Playgroud)

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

android:scrollbars = "vertical"
Run Code Online (Sandbox Code Playgroud)

并且,将此代码放在Java类中:

textview.setMovementMethod(new ScrollingMovementMethod());
Run Code Online (Sandbox Code Playgroud)


Sam*_*muh 26

你也可以

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


Val*_*lea 19

我找到的最佳方式:

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

android:background="@null"
android:editable="false"
android:cursorVisible="false"
Run Code Online (Sandbox Code Playgroud)

不需要在ScrollView中包装.

  • android:editable和android:cursorVisible已弃用 (6认同)
  • @JustinBuser不能不同意.:)这是完全偶然的,这是有效的,并且不能保证它将在未来的Android版本中.如果要滚动,请使用Android提供的滚动工具.`ScrollView`是正确的方法. (4认同)
  • @JustinBuser我的问题虽然是你依赖于EditText的默认行为,*我的意思可能很好地改变了道路(完全没有EditText将被弃用).您可以争辩说,但同样,我们的想法是使用适合手头任务的组件和功能.ScrollView明确设计为包含滚动.我总是试图,并总是建议其他人使用正确的工具来完成这项工作.对于任何给定的编程问题,几乎总有多种方法.无论如何,感谢您的深思熟虑的回应. (3认同)
  • 最好的方法是最合适的答案,尤其是考虑到EditText是TextView子类,而问题是如何使textview可滚动,而不是如何解决此问题。如果可以的话,我将投票两次:) (2认同)

Mor*_*ori 16

如果你使用Kotlin,则这样: XML

 <TextView
            android:id="@+id/tvMore"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:scrollbars="vertical" />
Run Code Online (Sandbox Code Playgroud)

活动

tvMore.movementMethod = ScrollingMovementMethod()
Run Code Online (Sandbox Code Playgroud)


MBH*_*MBH 15

简单.我就这样做了:

  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>
    
    Run Code Online (Sandbox Code Playgroud)
  2. Java方面:

    tv_log = (TextView) findViewById(R.id.tv_log);
    tv_log.setMovementMethod(new ScrollingMovementMethod());
    
    Run Code Online (Sandbox Code Playgroud)

奖金:

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

    android:gravity="bottom"
Run Code Online (Sandbox Code Playgroud)

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

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

    tv_log.append("\n" + text);
Run Code Online (Sandbox Code Playgroud)

我用它来记录日志.

我希望这有帮助 ;)


小智 13

这是"如何将ScrollBar应用于TextView",仅使用XML.

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

<TextView
    android:id="@+id/TEXT"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/long_text"/>
Run Code Online (Sandbox Code Playgroud)

接下来,将文本视图控件放在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>
Run Code Online (Sandbox Code Playgroud)

而已...

  • 为什么甚至写这个?这是一个几乎完全相同的,尽管不太正确的答案版本,在你写这篇文章之前发布了6个月. (6认同)

Mar*_*mer 11

Someone Somewhere上面的"专业提示"(使Android上的TextView可滚动)效果很好,但是,如果你动态地向ScrollView添加文本并希望在用户处于附加状态后自动滚动到底部,该怎么办?ScrollView的底部?(也许是因为如果用户已经向上滚动阅读某些内容,您不希望在追加期间自动重置到底部,这会很烦人.)

无论如何,这里是:

if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
        (mScrollView.getHeight() + mTextStatus.getLineHeight())) {
    scrollToBottom();
}
Run Code Online (Sandbox Code Playgroud)

如果用户位于ScrollView末尾的一行内,则mTextStatus.getLineHeight()将使它不会scrollToBottom().


IT-*_*Dan 10

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

ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
Run Code Online (Sandbox Code Playgroud)


Dip*_*dra 9

如果要在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您必须以这种方式在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"
 />
Run Code Online (Sandbox Code Playgroud)

而已.


Ral*_*aci 8

在 kotlin 中使 textview 可滚动

myTextView.movementMethod= ScrollingMovementMethod()
Run Code Online (Sandbox Code Playgroud)

并在xml中添加此属性

    android:scrollbars = "vertical"
Run Code Online (Sandbox Code Playgroud)


小智 7

在XML中的textview中添加以下内容.

android:scrollbars="vertical"
Run Code Online (Sandbox Code Playgroud)

最后,添加

textView.setMovementMethod(new ScrollingMovementMethod());
Run Code Online (Sandbox Code Playgroud)

在Java文件中.

  • 这不会进行动态滚动。不要使用它。 (2认同)

小智 7

yourtextView.setMovementMethod(new ScrollingMovementMethod());
Run Code Online (Sandbox Code Playgroud)

您现在可以滚动它。


and*_*sel 6

我没有找到TextView滚动来支持'fling'手势,它在向上或向下滑动后继续滚动.我最终实现了这一点,因为我不想出于各种原因使用ScrollView,并且似乎没有一个MovementMethod允许我选择文本并点击链接.

  • soo ...你是怎么添加这种投掷手势的? (6认同)

Rah*_*dia 5

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

((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
Run Code Online (Sandbox Code Playgroud)