【问题标题】:How do I completely prevent a TextView from scrolling?如何完全防止 TextView 滚动?
【发布时间】:2014-07-24 11:50:59
【问题描述】:

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

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

如何防止 TextView 滚动?

【问题讨论】:

  • 我没看到。我看到一个“水平滚动”字段和一个“滚动条”字段。你是指其中之一吗?
  • @DaveS... 这是安卓。这里没有 UITextViews...
  • 尝试设置textview padding="0dp"
  • @DaveS 所以你的意思是连续将scrollY设置为0?比如来自onScrollListener
  • 我 99% 确定您已经设置了 ScrollingMovementMethod 或者它的后代,例如 LinkMovementMethod

标签: android android-layout textview android-scroll


【解决方案1】:

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

设置滚动什么都不做

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

【讨论】:

    【解决方案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.setOnTouchListener(new LinkMovementMethodOverride());"

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好的,如果没有别的,我会研究这个,但我已经实现了整个“阅读更多”机制,所以我宁愿不做大的改变。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在 xml 中尝试这些代码行

        android:isScrollContainer="false"
        android:ellipsize="end"
        

        【讨论】:

        • 这个怎么样:android:scrollY="0px"
        • 刚刚试过了,还是不行。 Javadoc 将其列为“initial 垂直滚动偏移量,以像素为单位。”
        • 发布你的 xml,这样我可以更好地了解发生了什么
        • 我想我知道这里发生了什么,您可能为 textview 或包含它的布局设置了高度。将高度更改为 wrap_content 会修复它,如果确实是这样的话
        • 好的,我到电脑前检查/发布 xml。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多