13

我有一个包含大量文本的 TextView。这个 TextView 已经maxLines设置好了,所以它只显示前 8 行左右。我还有一个“阅读更多”按钮,所以我自己处理扩展 TextView。

我的问题是有时 TextView 会滚动一点(一次只有半行),即使我从未指定任何滚动条。由于 TextView 在 ListView 内部,因此这个问题变得更糟,因此当用户滚动主 ListView 时,TextView 有时会滚动一点,如下所示:

废话

如何防止 TextView 滚动?

4

5 回答 5

30

我有同样的问题,我的解决方案是像这样创建一个 NoScrollTextView 扩展 TextView

 public class NoScrollTextView extends TextView {
    public NoScrollTextView(Context context) {
        super(context);
    }

    public NoScrollTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NoScrollTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public NoScrollTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void scrollTo(int x, int y) {
        //do nothing
    }
}

设置滚动不做任何事情

在科特林:

class NonScrollingTextView : TextView {
    constructor(context: Context) : super(context) {}
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
    }

    override fun scrollTo(x: Int, y: Int) {
        //do nothing
    }
}
于 2016-03-24T04:24:29.753 回答
2

所以我做了一些研究,我认为这不像禁用滚动那么简单,但是你可以做/尝试一些事情。

第一个是 setEnabled(false) 但这将禁用链接并改变文本颜色。

我建议尝试的第二个方法是使用 scrollTo(int x, int y) 方法。在设置 TextView 的文本后只需 scrollTo(0,0),我的猜测是大文本是唯一导致滚动的东西,所以这应该能够处理它。

我发现你可以尝试的第三个答案有点复杂,不完全是你的问题,但它可能对你有用,可以在这里找到。

public class LinkMovementMethodOverride implements View.OnTouchListener{

@Override
public boolean onTouch(View v, MotionEvent event) {
    TextView widget = (TextView) v;
    Object text = widget.getText();
    if (text instanceof Spanned) {
        Spanned buffer = (Spanned) text;

        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP
                || action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = buffer.getSpans(off, off,
                    ClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    link[0].onClick(widget);
                } else if (action == MotionEvent.ACTION_DOWN) {                             
                    // Selection only works on Spannable text. In our case setSelection doesn't work on spanned text
                    //Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
                }
                return true;
            }
        }

    }

    return false;
}

}

“之后将其作为触摸侦听器应用到目标文本视图:-

textview.setOnTouchListener(new LinkMovementMethodOverride());"

于 2014-06-04T20:19:04.353 回答
0

我需要像在我的项目中看到更多这样的功能,并且我在这篇 SO 帖子中使用了省略文本视图。它就像一个魅力,还提供了一个界面来检查文本是否被省略了。这应该可以解决问题。

于 2014-06-04T01:01:49.003 回答
0

只需使用setMinLines()始终显示整个文本

于 2015-08-15T09:01:58.877 回答
-1

在 xml 中尝试这些代码行

android:isScrollContainer="false"
android:ellipsize="end"
于 2014-06-04T00:52:01.613 回答