0

我正在做以下工作TextView

<?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/tabsContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="3dp"
        android:background="@drawable/rounded_edges"
        android:gravity="bottom"
        android:padding="8dp"
        android:scrollHorizontally="false"
        android:scrollbarStyle="insideOverlay"
        android:scrollbars="vertical"
        android:textColor="#FFFFFF"
        android:textSize="11sp"
        android:typeface="monospace" />

TextView用于显示我从 a 获得的大量数据Socket,因此内容由背景更新Service。问题是,在一定数量的文本之后,滚动条被启用,每次我向 追加一行时TextView,滚动条开始显示并在每次向 追加新行时淡出TextView,因为它的重力设置为bottom,所以它对用户来说很烦人。

我想要实现的是仅当用户手动向上或向下滚动时才启用滚动条的可见性,但到目前为止还没有找到任何东西来实现这一点。我试过的是:

  • 在布局中设置android:scrollbarsto并实现 a ,因此它将启用to并在发布时再次设置为,但是由于一旦用户释放屏幕就会触发此事件,因此它不起作用。noneonClickListenerscrollingverticalnone

  • 与在 上onLongClickListener添加新行时的结果相同TextView,布局按原样设置在其底部gravitybottom因此实际上几乎不会触发此侦听器。

  • 同样onDragListener,我什至无法实现触发,所以我猜这不被识别为拖动动作。

  • 这个类没有实现onScrollListener.

在这一点上,我对如何实现这一点没有想法,所以任何建议都值得赞赏。谢谢。

4

1 回答 1

1

您可以在将新文本附加到 之前禁用垂直滚动条TextView,并在绘制文本后发布一个事件以重新启用它。

像这样的东西:

textView.setVerticalScrollBarEnabled(false);
textView.append("New Text");
textView.post(new Runnable() {
    @Override
    public void run() {
        textView.setVerticalScrollBarEnabled(true);
    }
});

当然,您应该重用单个Runnable对象来启用滚动条,而不是在每次更改文本时创建一个新对象。

请注意,如果您将TextView重力设置为底部,那么无论何时更改文本,它都会不断地滚动到底部,而不管用户在此期间是否进行了任何滚动。

于 2014-01-19T19:52:20.093 回答