是否可以在pre api-16设备上使用TextView#getMaxLines()?

时间:2013-04-27 18:24:11

标签: android textview android-lint

我在我的申请中使用了TextView#getMaxLines()几周没有发生任何事故。

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

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

2)有没有办法在pre-api 16设备上检索TextView的maxLines?我检查了 the source 但无法设法使用 2.2 device 上的公开方法检索此值。

3 个答案:

答案 0 :(得分:25)

TextViewCompat

中的支持lib v4 中添加了一个更简单的解决方案
int maxLines = TextViewCompat.getMaxLines(yourtextView);

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

答案 1 :(得分: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资源。

答案 2 :(得分:1)

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

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