我有一个包含大量文本的 TextView。这个 TextView 已经maxLines
设置好了,所以它只显示前 8 行左右。我还有一个“阅读更多”按钮,所以我自己处理扩展 TextView。
我的问题是有时 TextView 会滚动一点(一次只有半行),即使我从未指定任何滚动条。由于 TextView 在 ListView 内部,因此这个问题变得更糟,因此当用户滚动主 ListView 时,TextView 有时会滚动一点,如下所示:
如何防止 TextView 滚动?
我有一个包含大量文本的 TextView。这个 TextView 已经maxLines
设置好了,所以它只显示前 8 行左右。我还有一个“阅读更多”按钮,所以我自己处理扩展 TextView。
我的问题是有时 TextView 会滚动一点(一次只有半行),即使我从未指定任何滚动条。由于 TextView 在 ListView 内部,因此这个问题变得更糟,因此当用户滚动主 ListView 时,TextView 有时会滚动一点,如下所示:
如何防止 TextView 滚动?
我有同样的问题,我的解决方案是像这样创建一个 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
}
}
所以我做了一些研究,我认为这不像禁用滚动那么简单,但是你可以做/尝试一些事情。
第一个是 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());"
我需要像在我的项目中看到更多这样的功能,并且我在这篇 SO 帖子中使用了省略文本视图。它就像一个魅力,还提供了一个界面来检查文本是否被省略了。这应该可以解决问题。
只需使用setMinLines()始终显示整个文本
在 xml 中尝试这些代码行
android:isScrollContainer="false"
android:ellipsize="end"