2013-03-22 23 views
14

Ich habe TextView mit Breite wie wrap content. In diesem TextView setze ich Text, aber Text ist nicht jedes Mal die gleiche Länge. Wenn der Text sehr lang ist, verwende ich eine einzelne Zeile und true und ellipsize: Ende. Aber jetzt habe ich ein Problem. Ich möchte die Sichtbarkeit eines anderen Layouts einstellen, aber das hängt von der Länge meines Textes ab. Wenn Text zu lang ist, um in den Bildschirm zu passen, möchte ich Visible auf true setzen, aber wenn der Text kurz ist und ich keine Ellipsenbreite brauche, möchte ich die Sichtbarkeit auf false setzen. Also muss ich den Status meiner TextView überprüfen. Wenn seine Ellipse möchte ich setVisible wahr, wenn es nicht setVisible falsch ist. Wie kann ich das machen? Das ist, was ich habe:Prüfen, ob Textansicht in Android ellipsentiert ist

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); 

     } 

aber diese Lösung funktioniert nicht.

+0

Postleitzahl. sagen Sie, ob es Fehler gibt. damit die Leute besser verstehen, was Sie fragen wollen und wo genau Ihr Problem liegt. –

+0

Mögliches Duplikat von [Wie kann ich feststellen, ob meine Textansicht ellipsentiert wurde?] (Http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been-ellipsized) –

Antwort

43

können Sie diese Methode zur Verfügung gestellt verwenden: 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"); 
     } 
    } 
} 

wo Linie über GetLineCount erhalten werden konnte()

+0

Können Sie mir ein Beispiel mit dieser Methode zeigen? – user1302569

+0

Nur ein Methodenaufruf auf Ihrer Textansicht. Code hinzugefügt (nicht getestet) – Calvin

+0

funktioniert super, danke – user1302569

1

Mit getEllipsisCount gewohnt mit Text arbeiten, die leeren Zeilen in sich hat. Ich habe den folgenden Code verwendet, um es funktionieren zu lassen:

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; 
     } 
    }); 

Stellen Sie sicher, nicht ein MaxLineCount in Ihrem XML festzulegen. Dann können Sie nach dem lineCount in Ihrem Code suchen und wenn er größer als eine bestimmte Zahl ist, können Sie false zurückgeben, um die Zeichnung der TextView abzubrechen und die Zeilenanzahl sowie ein Flag zum Speichern festzulegen, ob die textView zu lang oder zu lang ist nicht. Die Textansicht wird erneut mit der richtigen Zeilenanzahl gezeichnet und Sie werden wissen, ob die Ellipse mit der Markierung übereinstimmt oder nicht.

Sie können dann das Flag isEllipsized verwenden, um das zu tun, was Sie benötigen.

+0

Ich nehme an, dass 'm.isEllipsized' nur ein Flag für die Klasse ist, die den Codeblock enthält Beispiel – Muxa

8

Nun, die akzeptierte Lösung funktioniert, aber einige Eckfälle fehlt, weil es nur die letzte Zeile für Ellipse Zeichen überprüft. Wenn wir einen TextView haben, der aus zwei Zeilen besteht und TruncateAt.START verwendet, um den Text an seinem Anfang abzuschneiden, schlägt die akzeptierte Antwort fehl. : -/

Hinzufügen eines ViewTreeObserver.OnPreDrawListener scheint eher wie ein wirklich teurer Aufwand für mich. Also habe ich die folgenden Verbesserungen am Code der angenommenen Antwort gemacht:

Es gibt noch Raum für Verbesserungen, obwohl. Aber diese Methode genügt meinen Anwendungsfällen. Korrekturen und Verbesserungen werden geschätzt. :-)