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

问题描述:

我在我的应用程序中使用了TextView#getMaxLines()几个星期没有发生意外。尽管(据我所知),我还没有修改任何会导致这个突然的标志的东西 - 我的min-sdk已经有8段时间了,我在源代码管理中有文件证明它。是否可以在pre-api-16设备上使用TextView#getMaxLines()?

1)为什么lint可能随机标记这个错误? (要说清楚,我的意思是说最初它应该已经发现 - 我不是暗示这是它根本不应该标记的东西)。

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

一个简单的办法加入到支持LIB V4TextViewCompat

int maxLines = TextViewCompat.getMaxLines(yourtextView); 

退房this回答一些更多的信息。

+1

在我看来,这个答案是最好的,应该接受 – 2015-12-11 11:41:23

+0

太棒了!这应该是一个被接受的答案! – box 2016-05-19 10:18:16

+0

适合我! – 2016-06-30 12:55:03

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

另一方面,我对这两个文件运行了差异,看起来好像新的4.2.2 TextView在内部没有使用任何新的API(这完全基于它的导入)。您可以将其作为类添加到项目中,并在所有版本的Android中使用它代替内置的TextView。

+0

我实际上计划对'TextView'进行子类化,所以我可以在XML中指定字体,所以这听起来像个好主意。我想在我的项目中添加这个作为类的开销会很小? (即使没有性能差异,如果我分类4.2.2 TextView(包括它之后)而不是2.2之一?) +1对于兼容性的初步检查,我会包含它并在API8模拟器。 – ataulm 2013-04-27 19:14:13

+0

我无法直接包含新版本;很多进口无法解决。我也尝试复制2.2 TextView类,并且无法解析相同的导入(例如'import android.content.res.CompatibilityInfo;') – ataulm 2013-04-27 20:29:27

您可以使用反射:

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(); 
    } 
} 

OR:

也许,最好的办法就是保持的MaXLine值的值,并将其设置在XML值,并获得尽可能在代码INT资源。

+1

我同意你的“但也许”部分,这就是我正在计划解决这个问题。我不认为使用反射有任何意义,因为如果不手动跟踪值*,除了使用getMaxLines()用于API16 +之外,我不能处理API16之前的设备(在这种情况下,会使后者变得多余)。 – ataulm 2013-04-27 20:11:22

+0

等啊,我想我完全误解了。 (如果你删除了bulletpoint标记,它会修正你的代码格式为SO。)如果'mMaximum'是私人的,它会在通话时得到正确的值吗? – ataulm 2013-04-27 20:15:20

+0

解决方案也可以切换解决方法。 – ataulm 2013-04-27 20:24:53