我有一个包含大量文本的TextView。此TextView设置为maxLines
,因此它仅显示前8行左右。我还有一个"阅读更多"按钮,所以我自己处理扩展TextView。
我的问题是,有时TextView会滚动一点(一次只有半行),即使我从未指定任何滚动条。这个问题变得更糟,因为TextView在ListView中,所以当用户滚动主ListView时,TextView有时会滚动一点,如下所示:
如何阻止TextView滚动?
答案 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"