【问题标题】:Is it possible to TextView#getMaxLines() on pre api-16 devices?是否可以在 api-16 之前的设备上使用 TextView#getMaxLines() ?
【发布时间】:2013-04-27 18:24:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android textview android-lint


    【解决方案1】:

    support lib v4 inTextViewCompat

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

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

    【讨论】:

    • 在我看来这个答案是最好的,应该被接受
    • 对我来说很好用!
    【解决方案2】:

    你可以使用反射:

    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资源。

    【讨论】:

    • 我同意您的“但是,也许”部分,这就是我计划解决此问题的方式。我认为使用反射没有任何意义,因为如果不手动跟踪值,我将无法处理 API 16 之前的设备除了使用getMaxLines() 用于 API16+(在在这种情况下,后者会使后者变得多余)。
    • 啊等等,我想我完全误解了。 (如果您删除项目符号标记,它会修复 SO 的代码格式。)如果 mMaximum 是私有的,它在调用时是否仍会获得正确的值?
    • @ataulm 用于获取私有字段值,您只需要设置 Field.setAccessible(true)。抱歉格式不好:(
    • 嗨,我正在尝试使用反射技术,但 getDeclaredField() 返回 null 并立即导致异常,即使该类包含这些变量。有什么想法吗?
    • @ahmad,你在这个类和这个字段中使用反射吗?或者它不在另一个班级工作?
    【解决方案3】:

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

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

    【讨论】:

    • 我实际上正计划对TextView 进行子类化,这样我就可以在 XML 中指定字体,所以这听起来是个好主意。我想在我的项目中将其添加为类会产生最小的开销吗? (如果我将 4.2.2 TextView (包含它之后)而不是 2.2 的子类化,甚至性能完全没有差异?) +1 用于初步检查兼容性,我将包含它并在 API8 模拟器上测试它.
    • 我无法直接包含新版本;很多进口无法解决。我也尝试复制 2.2 TextView 类,但无法解析相同的导入(例如import android.content.res.CompatibilityInfo;
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2022-01-15
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多