如何完全阻止TextView滚动?

时间:2014-06-04 00:25:15

标签: android android-layout textview android-scroll

我有一个包含大量文本的TextView。此TextView设置为maxLines,因此它仅显示前8行左右。我还有一个"阅读更多"按钮,所以我自己处理扩展TextView。

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

blahblah

如何阻止TextView滚动?

5 个答案:

答案 0 :(得分:22)

我有同样的问题,我的解决方案是创建一个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
    }
}

设置scrollTo什么都不做

在Kotlin:

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

答案 1 :(得分:2)

所以我做了一些研究,我不认为它只是简单地禁用滚动,但有一些事情你可以做/尝试。

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

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

我发现你可以尝试的第三个答案有点复杂而且不完全是你的问题,但它可能对你有用here

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

textview.setOnTouchListener(new LinkMovementMethodOverride());"

答案 2 :(得分:0)

我需要这样的功能,比如在我的项目中查看更多内容,并使用此SO帖子中的ellipsizing textview。它就像一个魅力,并提供了一个界面,用于检查文本是否被椭圆化。这应该可以解决问题。

答案 3 :(得分:0)

只需使用setMinLines()始终显示全文

答案 4 :(得分:-1)

在xml

中尝试这些代码行
android:isScrollContainer="false"
android:ellipsize="end"