Détecter si TextView dans ListView est délimité

J'ai une adaptateur personnalisé qui rend certains éléments dans un ListView. Je dois afficher une icône sur les éléments de ListView, si le texte de l'élément est délimité et le cacher s'il y a suffisamment de place pour terminer le texte. J'ai accès au bouton dans la méthode getView de mon adaptateur (où j'ai configuré le texte) mais les points suspensifs ne sont pas ajoutés immédiatement lors du réglage du texte.

Est-ce que je peux faire cela?

  • Définir la variable d'environnement ANDROID_HOME dans Mac
  • Obtenir des polices Web pour travailler avec phonegap et Android - comment?
  • SharedPreferences ne sont pas effacées lorsque je désinstalle
  • Erreur: impossible de trouver la méthode de symbole getMap () après la mise à jour des dépendances
  • Est-il possible de faire défiler une ScrollView avec un ConstraintLayout en mode Blueprint?
  • Utilisation du cache dans ExoPlayer
  • Voici mon balisage TextView:

    <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:id="@+id/list_item_description"/> 

  • Comment obtenir la lecture de la boussole Android?
  • Comment obtenir la variante de construction à l'exécution dans Android Studio?
  • Android - comment faire un fond de filetage correctement?
  • La classe Custom ImageView ne fonctionne pas avec la bibliothèque de téléchargement d'images Picasso
  • Existe-t-il un moyen d'obtenir le code source d'un fichier APK?
  • Comment désactiver le défilement ScrollView?
  • 4 Solutions collect form web for “Détecter si TextView dans ListView est délimité”

    Public int getEllipsisCount (ligne int) :

    Renvoie le nombre de caractères à délimiter, ou 0 s'il n'y a pas de points critiques.

    Alors, appelez simplement:

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

    Étant donné que le getLayout () ne peut pas être appelé avant la mise en page, utilisez ViewTreeObserver pour trouver lorsque la vue de texte est chargée:

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

    Et finalement, n'oubliez pas d'enlever removeOnGlobalLayoutListener lorsque vous en avez besoin nomore.

    La partie délicate est que la vue avec laquelle vous travaillez dans getView sera parfois définie, et parfois pas, donc vous devez gérer les deux cas.

    Lorsqu'il n'a pas été mis en place, vous avez configuré un observateur de l'arborescence de la vue pour vérifier les points de suspension une fois qu'il l'a été. Dans le cas de vues recyclées, la mise en page sera déjà là et vous pourrez vérifier les points critiques immédiatement après avoir configuré le texte.

     public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder vh; if (convertView == null) { vh = new ViewHolder(); ... // create/inflate view and populate the ViewHolder } vh = (ViewHolder) convertView.getTag(); // Set the actual content of the TextView vh.textView.setText(...); // Hide the (potentially recycled) expand button until ellipsizing checked vh.expandBtn.setVisibility(GONE); Layout layout = vh.textView.getLayout(); if (layout != null) { // The TextView has already been laid out // We can check whether it's ellipsized immediately if (layout.getEllipsisCount(layout.getLineCount()-1) > 0) { // Text is ellipsized in re-used view, show 'Expand' button vh.expandBtn.setVisibility(VISIBLE); } } else { // The TextView hasn't been laid out, so we need to set an observer // The observer fires once layout's done, when we can check the ellipsizing ViewTreeObserver vto = vh.textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout layout = vh.textView.getLayout(); if (layout.getEllipsisCount(layout.getLineCount()-1) > 0) { // Text is ellipsized in newly created view, show 'Expand' button vh.expandBtn.setVisibility(VISIBLE); } // Remove the now unnecessary observer // It wouldn't fire again for reused views anyways ViewTreeObserver obs = vh.textView.getViewTreeObserver(); obs.removeGlobalOnLayoutListener(this); } }); return convertView; } 

    J'espère que je comprends bien votre question – si vous cherchez à mettre fin à un TextView trop large pour un écran avec des ellipses, vous pouvez ajouter ces attributs à votre TextView :

     android:ellipsize="end" android:maxLines="1" android:scrollHorizontally="true" 

    Si, cependant, vous souhaitez déterminer si une TextView est terminée avec un point de suspension ou si elle est affichée complètement, je ne suis pas si sûr que cela ne soit pas possible. Pourtant, vous pouvez essayer la méthode getEllipsize() de TextView . Je ne sais pas si cela renvoie le point à l'endroit où TextView est délimité par Android, ou où vous avez défini l'affichage de texte pour être délimité.

    Vous pouvez soit définir votre texte sur la marque. Ajoutez ceci dans votre code pourrait aider …..

      android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:freezesText="true" android:marqueeRepeatLimit="marquee_forever" 

    Vous pouvez également mettre une vue de défilement horizontale pour votre code ….

      <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/list_item_description" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:ellipsize="end" android:gravity="center_vertical" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> </HorizontalScrollView> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.