【安卓UI】设置TextView自动化滑动

如何设置TextView控件当文本内容高度超出控件高度时自动滑动到最低端显示最新内容

TextView 是安卓中用于显示文本内容的控件,实际情况中会遇到要显示的文本高度过长,超出控件本身高度,从而需要手动滑动文本到最低端才能看到最新刷新出来的文本的问题。
要解决这个问题,通常需要使用TextView.scrollTo(int x, int y)的方法将TextView 控件设置成自动滑动到最底端显示最新文本。
需要计算出文本内容的高度,然后将 TextView 滚动到该高度的位置。这样可以确保最新的文本显示在视图的可见区域内。
具体方法如下:

  1. 在活动的activity_main.xml布局文件中设置TextView控件支持滑动
<TextView
        android:id="@+id/record"
        ...
        android:enabled="true"
        android:focusable="true"
        android:gravity="start"
        android:longClickable="true"
        android:scrollbarStyle="insideOverlay" // 设置滑动条显示格式
        android:scrollbars="vertical" // 启用垂直滚动条
        android:overScrollMode="always" // 用于控制视图在滚动到边界时的行为的属性。
        它可以设置为以下三个值之一:always:总是允许过度滚动。ifContentScrolls:仅当内容可以滚动时允许过度滚动。never:从不允许过度滚动。
        ...
        />
  1. 在活动的onCreate方法中初始化TextView控件,并设置滚动方法

  2. 在点击事件中计算TextView显示的内容是否需要滑动,以及设置滑动到的位置
    计算滚动量 scrollAmount,它是文本内容的总高度减去 TextView 的高度。
    使用 textView.scrollTo(0, scrollAmount) 方法将 TextView 滚动到最新文本的位置。

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    StringBuilder sb = new StringBuilder();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        textView.setMovementMethod(new ScrollingMovementMethod()); // 设置滚动方法
        textView.setTextIsSelectable(true); // 启用文本选择。当你为 TextView 设置了 ScrollingMovementMethod 以启用滚动功能时,默认情况下会禁用文本选择功能。且两者有时候会产生冲突,解决方法是:
        mTextView.setMovementMethod(LinkMovementMethod.getInstance()); // 设置滚动方法
        ...

        anotherButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 添加多行新文本
                sb.append(" line 1");
                sb.append(" line 2");
                ....

                // 计算是否需要滑动,并自动滚动到文本末尾
                // 方法一
                getMainExecutor().execute(() -> { // 确保在主线程UI线程中刷新控件内容
                    textView.setText(sb); // 设置控件内容
                    int offset = textView.getLineCount() * textView.getLineHeight() - textView.getHeight(); // 计算滑动位置
                    if (offset > 0) { // 实际显示内容高度超出空间高度
                        textView.scrollTo(0, offset); // 滑动到指定高度
                    }
                    textView.requestLayout(); // 请求重新布局视图,这意味着视图会被重新测量和布局,但不会改变视图的滚动位置
                }

                // 方法二
                textView.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(sb); // 设置控件内容
                        int scrollAmount = textView.getLayout().getLineTop(textView.getLineCount()) - textView.getHeight(); // 计算滑动位置
                        if (scrollAmount > 0) { // 实际显示内容高度超出空间高度
                            textView.scrollTo(0, scrollAmount); // 滑动到指定高度
                        }
                        textView.requestLayout(); // 请求重新布局视图,这意味着视图会被重新测量和布局,但不会改变视图的滚动位置
                    }
                });
            }
        });
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值