2017-07-20 3 views
1

J'essaie de faire face à neuf patches et l'emballage de mots dans une vue de texte. Le problème est que TextView ne redimensionne pas sa largeur en texte encapsulé, donc les bulles de discussion ont laissé un énorme écart que je ne peux pas réduire.android redimensionner les bulles de discussion largeur de texte enveloppé

le chat bulles avec des écarts

image

Enquête sur ViewHierarchy montre que ces lacunes sont à l'intérieur du TextView, vue hiérarchique de la mise en page dans le chat. donc ce n'est pas lié au neuf-patch. image

Peut-être quelqu'un face à un problème similaire ...

<LinearLayout 
android:id="@+id/messages" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:orientation="vertical"> 

<TextView 
    android:id="@+id/senderName" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:ellipsize="marquee" 
    android:gravity="bottom|start" 
    android:maxLines="1" 
    android:layout_marginTop="5dp" 
    android:layout_marginStart="18dp" 
    android:layout_marginLeft="18dp" 
    android:textColor="@color/talkatone_gray" 
    android:textSize="@dimen/chat_item_meta_info_text_size" 
    android:visibility="gone"/> 

    <TextView 
     android:id="@+id/message_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="end" 
     android:layout_marginBottom="@dimen/chat_bubble_margin_top" 
     android:background="@android:color/transparent" 
     android:lineSpacingExtra="4sp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:gravity="center_vertical" 
     android:text="@string/form_chat_failed_to_open" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:textColor="@color/chat_text" 
     android:textSize="@dimen/chat_text_message_size"/> 

    <FrameLayout 
     android:id="@+id/attachment_frame" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="@dimen/chat_bubble_margin_top" 
     android:orientation="vertical"> 

      <ImageButton 
       android:id="@+id/video_play_button" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical|center_horizontal" 
       android:background="@android:color/transparent" 
       android:contentDescription="@null" 
       android:src="@drawable/play_gif"/> 
    </FrameLayout> 

+0

changement LinearLayout largeur wrap_content même pour sender_name –

+0

@OussemaAroua appliqué votre suggestion, merci, mais il ne peut évidemment pas résoudre le problème – efuntikov

+0

Je pense que cela est parce que le dernier mot de la ligne particulière ne peut pas être en forme dans l'espace laissé à droite, donc ça descend. Essayez avec des mots plus petits et vérifiez une fois. – Debanjan

Répondre

0

dans votre cas, le principal problème est que vous utilisez l'adaptateur avec la mise en œuvre de modèle de viewholder.

Donc, il y a deux questions que vous devez résoudre:

  1. Réinitialiser TextView largeur à chaque fois avant que vous le réutiliser.
  2. Définissez la ligne la plus longue dans votre mesure TextView et définissez la largeur appropriée.

Pour reset largeur TextView ajouter à votre méthode getView adaptateur(), lorsque vous réutilisez votre porte, à côté:

ViewGroup.LayoutParams paramsReset = holder.messageText.getLayoutParams(); 
paramsReset.width = ViewGroup.LayoutParams.WRAP_CONTENT; 
holder.messageText.setLayoutParams(paramsReset); 

Pour la deuxième question, vous devez créer vue personnalisée, étendue de TextView et passer outre onDraw() méthode:

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    if(getLineCount() > 1) 
    { 
     float longestLineWidth = -1; 
     for (int lineIndex = 0; lineIndex < getLineCount(); lineIndex++) 
     { 
      int lineStartIndex = getLayout().getLineStart(lineIndex); 
      int lineEndIndex = getLayout().getLineEnd(lineIndex); 
      String currentTextLine = getText().toString().substring(lineStartIndex, lineEndIndex); 
      // Added "_____" for your paddings. 
      float currentLineWidth = getPaint().measureText(currentTextLine + "_____"); 

      if (longestLineWidth < currentLineWidth) 
      { 
       longestLineWidth = currentLineWidth; 
      } 
     } 
     ViewGroup.LayoutParams paramsNew = getLayoutParams(); 
     paramsNew.width = (int) longestLineWidth; 
     setLayoutParams(paramsNew); 
    } 
} 

J'Override onDraw() aussi à cause de besoin pour une utilisation dans ListView, semble que vous aurez besoin de trouver un autre rappel, qui appelle quand support est apparu en vue.


Il fonctionne, mais pas efficace, et ont d'autres questions, s'il vous plaît l'utiliser comme première étape.

0

Utilisez 9 images patch comme arrière-plan pour votre mise en page qui vous permet de créer des images bitmap qui se redimensionnent automatiquement pour le contenu de la vue.

0

Malheureusement, votre question comprend également votre réponse:

TextView ne redimensionne pas sa largeur au texte enveloppé

Lorsque vous utilisez wrap_content et permettre à plusieurs lignes, le système va d'abord développer la largeur du TextView aussi large que possible et seulement ensuite commencer à ajouter des sauts de ligne. Il ne fait jamais un passage à la fin pour récupérer la largeur disponible.

Bien sûr, comme pour tout, vous pouvez résoudre ce problème en écrivant votre propre classe personnalisée TextView. Voici un lien vers un autre projet qui a tenté de résoudre un problème similaire; peut-être que cela vous aidera à vous donner des idées.

Autre question: Uniform text wrapping in TextView

personnalisé TextView lib: https://github.com/dziobas/UniformTextView

+0

merci beaucoup! le prendra dans un compte – efuntikov