2013-04-27 75 views
3

我在我的應用程序中使用了TextView#getMaxLines()幾個星期沒有發生意外。儘管(據我所知),我還沒有修改任何會導致這個突然的標誌的東西 - 我的min-sdk已經有8段時間了,我在源代碼管理中有文件證明它。是否可以在pre-api-16設備上使用TextView#getMaxLines()?

1)爲什麼lint可能隨機標記這個錯誤? (要說清楚,我的意思是說最初它應該已經發現 - 我不是暗示這是它根本不應該標記的東西)。

2)是否有任何方法檢索pre-api 16設備上的TextView的maxLines?我檢查了the source但無法設計一種方法來檢索此值使用公開的方法在2.2 device

回答

25

一個簡單的辦法加入到支持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

1

該方法的代碼根本不存在於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

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

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

相關問題