2013-05-15 56 views
6

我有一個textview,我以編程方式設置maxLines,然後將其設置爲android:ellipsize =「end」。它可以部分工作,但由於某些原因,被截斷的文本會在4.2.2中的省略號後繼續保留幾個字符。這是被截斷的實際文本,而不是新的字符。android:ellipsize在ICS文本中繼續省略號

它在2.3.6中也不能正常工作,因爲它爲換行符或「\ n」的每個部分添加省略號。

我沒有使用任何自定義字體,我看到之前已經導致了問題。

這裏就是我計算並設定的maxlines:

final TextView reviewView = (TextView) view.findViewById(R.id.textViewPosition3); 

ViewTreeObserver observer = reviewView.getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int maxLines = (int) reviewView.getHeight()/reviewView.getLineHeight(); 
     reviewView.setMaxLines(maxLines); 
     reviewView.setEllipsize(TruncateAt.END); 
     reviewView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     //reviewView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
    } 
}); 

這裏是我的xml:

<?xml version="1.0" encoding="utf-8"?> 


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragmentTestLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 


    <ImageView 
     android:id="@+id/restaurantImage" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:src="@drawable/test" 
     android:layout_marginTop="-10dp" 
     android:layout_marginRight="20dp" 
     android:layout_marginLeft="20dp" 
     />  

    <ImageView 
     android:id="@+id/squareBlack" 
     android:layout_alignRight="@id/restaurantImage" 
     android:layout_alignTop="@id/restaurantImage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/square_black_small" 
     /> 

    <TextView 
     android:id="@+id/textViewPosition" 
     android:layout_alignRight="@id/squareBlack" 
     android:layout_alignLeft="@id/squareBlack" 
     android:layout_alignBottom="@id/squareBlack" 
     android:layout_alignTop="@id/squareBlack" 
     android:layout_margin="1dp" 
     android:gravity="center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This is a test" 
     android:textSize="25sp" 
     android:textColor="#a6cbff" 
     android:textStyle="bold" 
     /> 

    <ImageView 
     android:id="@+id/squareBlue" 
     android:layout_toLeftOf="@id/squareBlack" 
     android:layout_alignTop="@id/squareBlack" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/square_blue_small" 
     /> 

    <TextView 
     android:id="@+id/textViewPosition1" 
     android:layout_alignRight="@id/squareBlue" 
     android:layout_alignLeft="@id/squareBlue" 
     android:layout_alignBottom="@id/squareBlue" 
     android:layout_alignTop="@id/squareBlue" 
     android:layout_margin="1dp" 
     android:gravity="center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="7.5" 
     android:textSize="25sp" 
     android:textColor="#902515" 
     android:textStyle="bold" 
     /> 

    <TextView 
     android:id="@+id/restaurantName" 
     android:layout_alignLeft="@id/restaurantImage" 
     android:layout_alignBottom="@id/restaurantImage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Restaurant Name" 
     android:textSize="25sp" 
     android:textColor="#fff" 
     android:textStyle="bold" 
     android:background="@drawable/greybar" 
     /> 

    <TextView 
     android:id="@+id/textViewPosition2" 
     android:layout_below="@id/restaurantImage" 
     android:layout_centerHorizontal="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="February 15, 2013" 
     android:textColor="#555" 
     android:textStyle="bold" 
     android:textSize="15sp" 
     /> 

     <Button android:id="@+id/readReview" 
     android:background="@drawable/readreview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:text="Read the Review" 
     android:textColor="#fff" 
     android:textColorHighlight="#ccc" 
     android:textSize="15sp" 
     android:textStyle="bold" 
     android:layout_centerHorizontal="true" 
     /> 

     <TextView 
     android:id="@+id/textViewPosition3" 
     android:layout_below="@id/textViewPosition2" 
     android:layout_above="@id/readReview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="15sp" 
     android:textColorLink="#C90404" 
     android:layout_marginRight="15dp" 
     android:layout_marginLeft="15dp" 
     android:textColor="#000" 
     /> 



</RelativeLayout> 

回答

2

我解決了這個編程,但我不確定這是最好的解決方案,因爲它更像是一種黑客攻擊。它似乎在工作。

 ViewTreeObserver observer = reviewView.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int maxLines = (int) reviewView.getHeight()/reviewView.getLineHeight(); 

      reviewView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 


      if(reviewView.getLineCount() > maxLines) 
      { 
       int lineEndIndex = reviewView.getLayout().getLineEnd(maxLines - 1); 
       String text = reviewView.getText().subSequence(0, lineEndIndex-3) +" ..."; 
       reviewView.setText(text); 
      } 
     } 
    }); 
+0

似乎解決了這個問題。非常感謝你。 – Garcon

0

把這個XML

android:singleLine="true" 
    android:ellipsize="end"    
    android:maxLines="1" 
+0

這不起作用,因爲我需要一個多行textview,根據屏幕大小動態填充屏幕空間。因此,我試圖以編程方式設置maxLines。 – user2110291