2010-07-30 80 views
5

我有一個TextView,它顯示更改和運行時間的文本。我想使用View.getLineCount()方法來查看TextView佔用了多少行,並相應地執行不同的功能。問題是我需要確定TextView佔用的行數,需要知道它佔用了多少行。我曾嘗試在兩次調用之間調用View.invalidate(),但似乎沒有解決任何問題。如果可能的話,我想測量行數而不渲染視圖,但如果我必須渲染它,我也會公開這樣做。讓我知道如果這不夠具體,我會盡量做得更具體。謝謝!Android:測量渲染前的視圖大小

回答

1

這實際上可能是Android中非常複雜的問題。如果您在設置文本的時候需要知道(即在視圖呈現或接近呈現之前),則只有使用StaticLayout纔是真正的選擇。如果你能等待,直到臨近渲染時間,你可以使用一個viewTreeObserver:

yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout(){ 
     yourTextView.getLineCount(); 
    } 
} 

onGlobalLayout可以多次調用,有時(無論何種原因)我發現,意見沒有實際佈局還,所以你應該做一些日誌記錄,看看你是否能找到一種方法來確保你得到的結果實際上是有意義的(即行計數> 0)。

StaticLayouts是一個更復雜的替代方案,它應該能夠爲您提供視圖大小和行數。他們可能需要一些調整,以獲得正常工作,並確保您使用視圖中的油漆你試圖測量:

yourTextView.setText(newText); 
//the last boolean should be true if you're using padding on your view 
StaticLayout measure = new StaticLayout(yourTextView.getText(), yourTextView.getPaint(), 
    maxAvailableWidthForYourTextView, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false) 

int numberOfLines = measure.getLineCount(); 

如果你願意(或已經)的子類的TextView,你可以覆蓋onSizeChanged或onMeasure並嘗試獲取那裏的行數。同樣,與視圖樹觀察者一樣,有時可以在實際測量視圖之前調用這些視圖,因此您可能需要檢查以確保您在這些方法中獲得的任何值都有意義。