webentwicklung-frage-antwort-db.com.de

Wie kann ich feststellen, ob meine Textansicht ellipsenförmig ist?

Ich habe eine mehrzeilige TextView, die Android:ellipsize="end" eingestellt hat. Ich möchte jedoch gerne wissen, ob die Zeichenfolge, die ich dort platziere, tatsächlich zu lang ist (damit ich sicherstellen kann, dass die vollständige Zeichenfolge an anderer Stelle auf der Seite angezeigt wird).

Ich könnte TextView.length() verwenden und herausfinden, was die ungefähre Länge der Zeichenfolge sein wird. Da es sich jedoch um mehrere Zeilen handelt, wird mit TextView gearbeitet, wann umbrochen werden soll. Dies funktioniert also nicht immer.

Irgendwelche Ideen?

62
FrederickCook

Sie können das Layout der TextView ermitteln und die Anzahl der Ellipsis pro Zeile überprüfen. Für ein Ende der Ellipsis reicht es aus, die letzte Zeile wie folgt zu überprüfen:

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

Dies funktioniert nur nach der Layoutphase. Andernfalls ist das zurückgegebene Layout null. Rufen Sie es also an geeigneter Stelle in Ihrem Code auf.

108
Thorstenvv

textView.getLayout ist der Weg, aber das Problem ist, dass es null zurückgibt, wenn das Layout nicht vorbereitet ist. Verwenden Sie die untenstehende Lösung.

 ViewTreeObserver vto = textview.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
           Layout l = textview.getLayout();
           if ( l != null){
              int lines = l.getLineCount();
              if ( lines > 0)
                  if ( l.getEllipsisCount(lines-1) > 0)
                    Log.d(TAG, "Text is ellipsized");
           }  
        }
    });
27

Ich denke, die einfachste Lösung für diese Frage ist der folgende Code:

String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));

Dieser Code setzt voraus, dass die TextView in Ihrer XML-Datei eine maxLineCount festgelegt hat. :)

15

public int getEllipsisCount (int line) :

Gibt die Anzahl der Zeichen zurück, die entfernt werden sollen, oder 0, wenn keine Ellipsis stattfinden soll.

Also einfach anrufen:

int lineCount = textview1.getLineCount();

if(textview1.getLayout().getEllipsisCount(lineCount) > 0) {
   // Do anything here..
}

Da getLayout () nicht aufgerufen werden kann, bevor das Layout festgelegt ist, verwenden Sie Folgendes: 

ViewTreeObserver vto = textview.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
       Layout l = textview.getLayout();
       if ( l != null){
          int lines = l.getLineCount();
          if ( lines > 0)
              if ( l.getEllipsisCount(lines-1) > 0)
                Log.d(TAG, "Text is ellipsized");
       }  
    }
});

Und vergessen Sie nicht, removeOnGlobalLayoutListener zu entfernen, wenn Sie es brauchen.

3
amalBit

Das funktionierte für mich:

textView.post(new Runnable() {
                        @Override
                        public void run() {
                            if (textView.getLineCount() > 1) {
                                //do something
                            }
                        }
                    });
2
Cícero Moura

Ich habe eine benutzerdefinierte TextView mit einer Listener-Benachrichtigung für dieses Problem erstellt. Es behebt auch das Problem der mehrzeiligen Ellipse. Sie finden es unter Android ellipsize multiline textview

2
Micah Hainline

es funktioniert für mich

if (l != null) {
    int lines = l.getLineCount();
     if (lines > 0) {
     for (int i = 0; i < lines; i++) {
     if (l.getEllipsisCount(i) > 0) {
      ellipsize = true;
      break;
     }
    }
   }
  }
1
coffee
lateinit var toggleMoreButton: Runnable
toggleMoreButton = Runnable {
  if(reviewTextView.layout == null) { // wait while layout become available
       reviewTextView.post(toggleMoreButton) 
       [email protected]
  }
  readMoreButton.visibility = if(reviewTextView.layout.text.toString() != comment) View.VISIBLE else View.GONE
}
reviewTextView.post(toggleMoreButton)

Es ist ein typischer Fall:

  1. kommentar in 'reviewTextView'
  2. kommentar kann durch einige Kriterien reduziert werden
  3. wenn der Kommentar reduziert wurde, zeigen Sie den Button 'readMoreButton' an.
1
A.Y.

Wirklich so arbeiten, um beispielsweise vollständige Daten aus einem RecyclerView-Element an den Dialog zu übergeben:

holder.subInfo.post(new Runnable() {
                @Override
                public void run() {
                    Layout l = holder.subInfo.getLayout();
                    if (l != null) {
                        final int count = l.getLineCount();
                        if (count >= 3) {
                            holder.subInfo.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    final int c = holder.subInfo.getLineCount();
                                    if (c >= 3) {
                                        onClickToShowInfoDialog.showDialog(holder.title.getText().toString(), holder.subInfo.getText().toString());
                                    }
                                }
                            });
                        }
                    }
                }
            });
0