How do I completely prevent a TextView from scrolling? How do I completely prevent a TextView from scrolling? android android

How do I completely prevent a TextView from scrolling?


I have the same problem,My solution is create a NoScrollTextView extends TextView like this

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

set scrollTo do nothing

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


So I did a little research and I don't think it's as simple as just disabling scrolling, but there are a few things you can do/try.

The first is setEnabled(false) but this will disable links and alter the text color.

The second, which I suggest trying, is using the scrollTo(int x, int y) method. Just scrollTo(0,0) after setting the text of the TextView, my guess is the large text is the only thing causing the scrolling so this should be able to take care of it.

The third answer I found that you can try is a bit more complicated and not exactly your question but it may work for you can be found here.

public class LinkMovementMethodOverride implements View.OnTouchListener{@Overridepublic 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;}}

"After that apply it to the target textview as touch listener: -

textview.setOnTouchListener(new LinkMovementMethodOverride());"


I needed feature like see more in my project and I used ellipsizing textview from this SO post. It works like a charm and also provides an interface for checking if the text was ellipsized. This should do the trick.