2013-01-05 11 views
17

Mam TextView o nieznanej maksymalnej wysokości, która jest zależna od rozdzielczości DPI/ekranu urządzenia. Tak więc, na przykład, na urządzeniu MDPI ta maksymalna wysokość umożliwia wyświetlanie tylko 2 linii naraz, a wartość ta może zostać zwiększona do nieokreślonej liczby.Elipsa nie działa poprawnie dla wielowierszowego TextView z dowolną maksymalną wysokością

Mój problem jest związany z funkcjonalnością elipsy. Załóżmy, że określone urządzenie pozwala wyświetlić 4 linie. Jeśli ręcznie ustawiam maksymalną liczbę linii, tak ...

<TextView 
    android:id="@+id/some_id" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:ellipsize="end" 
    android:maxLines="4" 
    android:singleLine="false" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="This is some really really really really really long text" 
    android:textSize="15sp" /> 

... wszystko działa poprawnie. Jeśli tekst nie mieści się prawidłowo, wówczas elipsa są dodawane na końcu czwartej linii, tak:

This is some 
really really 
really really 
really long... 

Ale wolałbym nie ustawić liczbę wierszy jako zmiennej statycznej, wolałbym włączyć obsługę dowolnej kombinacji rozdzielczości DPI/ekranu. Więc jeśli mogę usunąć maxLines wielokropek nie jest już poprawnie przedstawione w wierszu cztery, pokazując zamiast niepełną część tekstu:

This is some 
really really 
really really 
really long 

Gdybym nieznacznie zwiększyć rozmiar TextView, widzę, że reszta tekstu jest nadal narysowany "za" innym Views. Ustawienie zmiennej maxHeight również nie działa.

Naprawdę nie mogę znaleźć rozwiązania dla tego problemu. Jakieś pomysły? Jeśli to pomaga, pracuję tylko z Androidem w wersji 4.0.3 i nowszej (poziom interfejsu API 15).

Odpowiedz

27

Oblicz, ile linii pasuje do TextView z TextView#getHeight() i TextView#getLineHeight(). Następnie zadzwoń pod numer TextView#setMaxLines().

ViewTreeObserver observer = textView.getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int maxLines = (int) textView.getHeight() 
       /textView.getLineHeight(); 
     textView.setMaxLines(maxLines); 
     textView.getViewTreeObserver().removeGlobalOnLayoutListener(
       this); 
    } 
}); 
+0

Działa idealnie. Dziękuję Ci bardzo! – DPR

+0

Godlike! Uratowałem mój dzień! – Roman

+2

Uwaga: wysokość linii może się różnić! I dlatego metoda getLineHeight nie będzie działać zgodnie z oczekiwaniami. Może się to zdarzyć na przykład podczas używania spannables do zwiększenia rozmiaru czcionki w określonej części tekstu. –

Powiązane problemy