2013-03-22 21 views
14

Mam TextView o szerokości jako wrap content. W tym TextView ustawiam tekst, ale tekst za każdym razem nie ma tej samej długości. Kiedy tekst jest bardzo długi, używam pojedynczej linii true i ellipsize: end. Ale teraz mam problem. Chcę ustawić widoczność innego układu, ale to zależy od długości mojego tekstu. Jeśli tekst jest zbyt długi, aby zmieścić się na ekranie, chcę ustawić true, ale gdy tekst jest krótki i gdy nie potrzebuję elipsy, chcę ustawić widoczność false. Muszę więc sprawdzić status mojego TextView. Kiedy jego elipsa chcę, aby setVisible prawda, kiedy nie jest fałszywa. Jak mogę to zrobić. To jest to, co mam:Sprawdź, czy widok tekstu jest elipsy w Androidzie

tvAle.post(new Runnable() { 

     @Override 
     public void run() { 

      int lineCount = tvAle.getLineCount(); 
      Paint paint = new Paint(); 
      paint.setTextSize(tvAle.getTextSize()); 
      final float size = paint.measureText(tvAle.getText().toString()); 
      Log.v("a", ""+size+" "+tvAle.getWidth()); 
      if ((int)size > (tvAle.getWidth()+10)) { 
       allergiesLayout.setVisibility(View.VISIBLE); 
      } 

      else 
       allergiesLayout.setVisibility(View.GONE); 

     } 

ale to rozwiązanie nie działa.

+0

kod pocztowy. powiedzieć, czy są jakieś błędy. aby ludzie lepiej zrozumieli, o co chcesz zapytać i gdzie dokładnie jest twój problem. –

+0

Możliwy duplikat [Jak mogę sprawdzić, czy mój widok tekstowy został usunięty?] (Http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been- ellipsized) –

Odpowiedz

43

Można użyć tej metody, pod warunkiem że: getEllipsisCount

Layout layout = textview1.getLayout(); 
if(layout != null) { 
    int lines = layout.getLineCount(); 
    if(lines > 0) { 
     int ellipsisCount = layout.getEllipsisCount(lines-1); 
     if (ellipsisCount > 0) { 
      Log.d(TAG, "Text is ellipsized"); 
     } 
    } 
} 

gdzie linia można uzyskać poprzez getLineCount()

+0

Czy możesz pokazać mi przykład z tą metodą? – user1302569

+0

Po prostu wywołanie metody w twoim widoku tekstowym. Dodano kod. (nie testowane) – Calvin

+0

działa świetnie, dziękuję – user1302569

1

Korzystanie getEllipsisCount przyzwyczajenie praca z tekstem, który ma pustych linii w jego obrębie. Użyłem następującego kodu, aby działał:

message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 

      if(m.isEllipsized == -1) { 
       Layout l = message.getLayout(); 
       if (message.getLineCount() > 5) { 
        m.isEllipsized = 1; 
        message.setMaxLines(5); 
        return false; 
       } else { 
        m.isEllipsized = 0; 
       } 
      } 
      return true; 
     } 
    }); 

Upewnij się, że nie ustawiłeś maxLineCount w twoim XML. Następnie możesz sprawdzić wartość lineCount w swoim kodzie i jeśli jest ona większa niż pewna liczba, możesz zwrócić wartość false, aby anulować rysunek TextView i ustawić liczbę linii oraz flagę, aby zapisać, czy textView jest zbyt długi lub nie. Widok tekstowy zostanie ponownie narysowany z prawidłową liczbą linii i będziesz wiedział, czy jest on elipsowany, czy nie, z flagą.

Następnie można użyć flagi isEliplip, aby wykonać dowolną czynność.

+0

Zakładam, że 'm.isEllipsized' to tylko flaga ustawiona na klasie, która zawiera blok kodu w przykład – Muxa

8

Cóż, zaakceptowane rozwiązanie działa, ale pomija kilka przypadków narożnych, ponieważ sprawdza tylko ostatnią linię dla elipsy. Jeśli mamy TextView składający się z dwóch linii i używamy TruncateAt.START do skracania tekstu na jego początku, zaakceptowana odpowiedź zakończy się niepowodzeniem. : -/

Dodanie ViewTreeObserver.OnPreDrawListener wydaje mi się bardziej kosztowne. Wprowadziłem więc następujące poprawki kodu akceptowanej odpowiedzi:

/** 
* Checks if the text of the supplied {@link TextView} has been ellipsized. 
* 
* @param textView 
*   The {@link TextView} to check its text. 
* 
* @return {@code True} if the text of the supplied {@code textView} has been ellipsized. 
*/ 
public static boolean isTextViewEllipsized(final TextView textView) { 
    // Initialize the resulting variable 
    boolean result = false; 
    // Check if the supplied TextView is not null 
    if (textView != null) { 
     // Check if ellipsizing the text is enabled 
     final TextUtils.TruncateAt truncateAt = textView.getEllipsize(); 
     if (truncateAt != null && !TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) { 
      // Retrieve the layout in which the text is rendered 
      final Layout layout = textView.getLayout(); 
      if (layout != null) { 
       // Iterate all lines to search for ellipsized text 
       for (int index = 0; index < layout.getLineCount(); ++index) { 
        // Check if characters have been ellipsized away within this line of text 
        result = layout.getEllipsisCount(index) > 0; 
        // Stop looping if the ellipsis character has been found 
        if (result) { 
         break; 
        } 
       } 
      } 
     } 
    } 
    return result; 
} 

Nadal jednak jest miejsce na poprawę. Ale ta metoda wystarcza moim przypadkom użycia. Korekty i ulepszenia są doceniane. :-)