2013-08-06 99 views
11

我有一個包含多行TextView的Android應用程序佈局。當屏幕處於縱向方向時,TextView可以在橫向模式下運行時顯示不同長度的文本。另外,當在小屏幕上運行時,TextView可以在更大的屏幕上顯示不同長度的文本。Android多行TextView,檢查文本是否適合,或檢查是否TextView已滿

有什麼方法可以檢查文本是否適合或將被截斷?或者有什麼方法可以檢查TextView是否已滿?

問題是TextView的有可能包含不同的行數,取決於它是否是風景,人像,小屏幕,大屏幕等

謝謝你的建議,

最佳問候,

詹姆斯

回答

0

對於檢查多(或沒有)的TextView是否將被截斷,檢查this post

或者,你有沒有看過使用滾動textview? (marquee)..如果文本在給定寬度下太長,文本將會滾動(橫向,動畫)?

這裏是一個佈局文件的例子TextView的,有一些這樣的特點:

<TextView 
    android:id="@+id/sometextview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="marquee" 
    android:marqueeRepeatLimit="marquee_forever" 
    android:singleLine="true" 
    android:scrollHorizontally="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:freezesText="true" 
    android:textColor="#808080" 
    android:textSize="14sp" 
    android:text="This is a long scrolling line of text.. (etc)"/> 
+0

關於你的XML,這對我不起作用,因爲它設置singleLine =「true」,它不是一個MULTILINE TextView。關於檢查這篇文章,這對我不起作用,因爲「testPaint.measureText(text)」只計算文本寬度。它不計算MULTILINE TextView的文本高度。我現在已經找到了另一個解決方案,我將很快添加。 – James

+0

該答案不涉及多行文本視圖。它只檢查文本是否會填充textveiw的*寬度* – LairdPleng

+0

問題不僅是詢問多行;它也會詢問關於在文本視圖中的「擬合」...... – MiStr

3

基本上,你需要計算你的TextView的大小和文字大小的時候方向模式改變。試試ViewTreeObserver.OnGlobalLayoutListener這樣做。

的變化方向方法中:

main_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      main_view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      //Calculation goes here 
      int text_size = getTextSize(text_view.getText().toString()); 
      int text_view_size = text_view.getLayoutParams().width; 
      //Compare your text_size and text_view_size and do whatever you want here. 
     } 
    }); 

這裏是計算text_size的代碼:

private int getTextSize(String your_text){ 
    Paint p = new Paint(); 
    //Calculate the text size in pixel 
    return p.measureText(your_text); 
} 

希望這有助於。

+1

這對我來說不起作用,因爲「p.measureText(your_text)」僅計算文本寬度。它不計算MULTILINE TextView的文本高度。我現在已經找到了另一個解決方案,我將很快添加。 – James

8

我已經找到了「厚臉皮」的解決方案,以測量文本的高度多行的TextView 的問題: -

//Calculate the height of the text in the MULTILINE TextView 
int textHeight = textView.getLineCount() * textView.getLineHeight(); 
if (textHeight > textViewHeight) { 
    //Text is truncated because text height is taller than TextView height 
} else { 
    //Text not truncated because text height not taller than TextView height 
} 

但是這個解決方案有一些警告: -

首先,關於getLineHeight(),文本內的標記可能導致單個行比這個高度更高或更短,並且該佈局可能包含額外的第一行或最後一行的填充。請參閱http://developer.android.com/reference/android/widget/TextView.html#getLineHeight()

其次,應用程序需要計算TextView的實際高度(以像素爲單位),並且(對於我的佈局)它可能不像textView.getHeight()那麼簡單,並且計算可能會因一個佈局到另一個佈局。

我會推薦避免 LinearLayout,因爲TextView的實際像素高度可能因文本內容而異。我正在使用RelativeLayout(請參閱http://pastebin.com/KPzw5LYd)。

使用這個 RelativeLayout的,我可以計算 TextView的高度如下: -

//Calculate the height of the TextView for layout "http://pastebin.com/KPzw5LYd" 
int textViewHeight = layout1.getHeight() - button1.getHeight() - button2.getHeight(); 

希望幫助,

問候,

詹姆斯

9

這些答案對我來說工作不太好。這是我最後做

Paint measurePaint = new Paint(myTextView.getPaint()); 
float pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?"); 
float labelWidth = myTextView.getWidth(); 
int maxLines = myTextView.getMaxLines(); 

while (labelWidth > 0 && pWidth/maxLines > labelWidth-20) { 
    float textSize = measurePaint.getTextSize(); 
    measurePaint.setTextSize(textSize-1); 
    pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?"); 
    if (textSize < TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_SP, 7, 
      getContext().getResources().getDisplayMetrics())) break; 
} 

myTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, measurePaint.getTextSize()); 

我不是說這將適用於所有情況,因爲我肯定偷工減料這裏,但總的想法是測量與TextView的的油漆文字和不斷縮短它直到它適合textview。