android:ellipsize в тексте ICS продолжается после многоточия

У меня есть текстовое представление, с которым я программно устанавливаю maxLines, а затем устанавливаю его на android:ellipsize="end". Это работает частично, но по какой-то причине усекаемый текст продолжается несколько символов после многоточия в 4.2.2. Усекается фактический текст, а не новые символы.

Он также не работает должным образом в версии 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>

person user2110291    schedule 15.05.2013    source источник


Ответы (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);
            }
        }
    });
person user2110291    schedule 05.09.2013

поместите это в xml

    android:singleLine="true"
    android:ellipsize="end"             
    android:maxLines="1"
person Giant    schedule 15.05.2013
comment
Это не сработает, потому что мне нужно многострочное текстовое представление, которое динамически заполняет пространство экрана в зависимости от размера экрана. Поэтому я пытаюсь установить maxLines программно. - person user2110291; 15.05.2013