3

TextView#getMaxLines()在我的应用程序中使用了几个星期,没有发生任何事故。

Lint 现在通知我它仅在 API 16+ 中可用(#setMaxLines()是 API 1+...),但是(据我所知)我没有修改任何会导致这个突然标志的东西 - 我的 min-sdk 有已经 8 了一段时间,我的源代码管理中有文件来证明这一点。

1) 为什么 lint 会随机标记此错误?(要清楚,我的意思是说它最初应该抓​​住它 - 我并不是暗示这是它根本不应该标记的东西)。

2) 有没有办法在 pre-api 16 设备上检索 TextView 的 maxLines?我检查了源代码,但无法设计一种方法来使用2.2 device上的公开方法来检索此值。

4

3 回答 3

26

在support lib v4中添加了一个更简单的解决方案TextViewCompat

int maxLines = TextViewCompat.getMaxLines(yourtextView);

查看答案以获取更多信息。

于 2015-12-10T12:52:05.237 回答
4

您可以使用反射:

Field mMaximumField = null;
Field mMaxModeField = null;
try {
    mMaximumField = text.getClass().getDeclaredField("mMaximum");
    mMaxModeField = text.getClass().getDeclaredField("mMaxMode");
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

if (mMaximumField != null && mMaxModeField != null) {
    mMaximumField.setAccessible(true);
    mMaxModeField.setAccessible(true);

    try {
        final int mMaximum = mMaximumField.getInt(text); // Maximum value
        final int mMaxMode = mMaxModeField.getInt(text); // Maximum mode value

        if (mMaxMode == 1) { // LINES is 1
            text.setText(Integer.toString(mMaximum));
        }
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

或者:

也许,最好的方法是将 maxLine 的值保持为值并在 xml 中设置它的值,并在代码中获取为 int 资源。

于 2013-04-27T19:23:36.633 回答
1

该方法的代码在 2.2 上根本不存在,因此您当然不能直接使用它。

另一方面,我对这两个文件进行了比较,似乎新的 4.2.2 TextView 在内部没有使用任何新的 API(这仅基于其导入)。您可以将它作为一个类添加到您的项目中,并在所有版本的 Android 中使用它而不是内置的 TextView。

于 2013-04-27T19:00:05.693 回答