确定 TextView 是否需要滚动

Determine if a TextView requires scrolling

CursorAdapterbindView() 中,我将数据绑定到以下布局:

一个TextView和两个Button:"UP"和"DOWN".

TextView 在 XML 中定义如下:

<TextView
    android:id="@+id/tv_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="25dp"
    android:paddingRight="25dp"
    android:paddingTop="25dp"
    android:scrollbars="vertical"
    android:textAlignment="textStart"
    android:textColor="#5c6284"
    app:autoSizeMaxTextSize="40sp"
    app:autoSizeMinTextSize="20sp"
    app:autoSizeTextType="uniform" />

垂直滚动行为应用于 TextView,它由“UP 和 "DOWN" Button 控制。

我想确定 TextView 是否需要滚动(足够长以至于不适合其提供的绘图区域)以便我可以 enable/disable "UP" 和 "DOWN" 相应的按钮。

我目前正在阅读 BaseMovementMethodscrollDown 函数,考虑将其测量逻辑应用到我的适配器中,尽管我觉得它应该更简单。也许是我不知道的内置行为。

除了我建议的方法外,还有更好的方法吗?

您可以使用 Static Layout class。如果您使用 TextView 的参数设置它,您将能够计算呈现文本的高度。

Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;

StaticLayout myStaticLayout = new StaticLayout(text, myTextView.getPaint(), myTextView.getWidth(), alignment, spacingMultiplier, spacingAddition, includePadding);

float height = myStaticLayout.getHeight(); 

然后您可以比较文本的高度和 TextView 的高度,并确定它是否需要滚动。

如果 myTextView.getPaint() 方法不起作用,您也可以尝试使用最小文本大小手动创建 Paint 对象。

我会做的是将 textview 放在滚动视图中,如下所示:

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="test texts here"/>
</ScrollView>

在您的 activity 中,执​​行这些行:

boolean needScrolling = false;
if(scroller.getHeight() < tv_content.getHeight()) needScrolling = true;

计算mTextView无数据和有数据的身高然后比较

mTextView.post(new Runnable() {
        @Override
        public void run() {
            int lineHeight=mTextView.getCompoundPaddingBottom()+ mTextView.getCompoundPaddingTop()+mTextView.getLineHeight();
            int height=mTextView.getHeight()-(mTextView.getCompoundPaddingTop()+mTextView.getLineHeight());
            if (height>lineHeight){

            }
        }
    });