2011-08-31 5 views
0

J'ai un TextView dont la hauteur est dynamique. Je veux définir que la dernière ligne ne serait pas visible si elle ne peut pas être entièrement dessinée. La raison pour laquelle height est dynamique est qu'il est utilisé dans un AppWidget, et la taille d'un appwidget n'est pas la même sur des périphériques différents. Pour cette raison, vous ne pouvez pas mesurer le TextView ou vous ne pouvez pas utiliser une sous-classe d'un TextView. linkTextView Dernière ligne tracée en deux

C'est ce que j'utilise maintenant essentiellement. Quand je mets un long texte dans le TextView, la dernière ligne semble moche.

<LinearLayout 
android:id="@+id/widgetContent" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 
<TextView 
    android:id="@+id/sg" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 
+0

Postez votre code textview once..so que nous pouvons faire quelque chose. – Udaykiran

+0

C'est bien si vous n'êtes pas dans un AppWidget. Il existe un exemple d'application [Wiktinary] (http://developer.android.com/resources/samples/Wiktionary/index.html). Il utilise android: fadingEdge = "vertical" là. Ce n'est pas le meilleur mais je pense que je vais utiliser ça. – jakk

Répondre

3

Essayez cette

Paint paint = new Paint(); 
// set paint with all current text properties of the textview. like text size, face etc, 

textPixelLenght = paint.measureText(mText); 
int textviewWidth = mTextView.getMeasuredWidth(); 
int numberOfLines = textPixelLenght /textviewWidth;; 

int textlineHeight = textview.getLineHeight(); 
if (textlineheight * numberOfLines > textviewHeight) { 
    // text going beyond textviews height. Ellipsize the text using 
    // TextUtils.ellipsize(params);  
} 
+0

Cela ne résout pas le problème, mais cela est correct lorsque vous n'êtes pas dans un AppWidget. – jakk

+0

Il n'est pas précis d'utiliser textPixelLenght/textviewWidth comme LineNum – chefish

0

Une solution à votre problème serait de créer un TextView personnalisé et remplacer la méthode onDraw() du TextView. Là, vous pouvez gérer la façon dont cette TextView gère ce cas.

+1

Ce serait dans un appwidget. Donc, étendre TextView n'est pas bon. – jakk

1

Vous devez connaître l'espacement de votre police -

-à-dire, si vous connaissez ses 20 caractères par ligne, et vous savez chaque ligne complète est 10px élevée, vous devez attribuer dynamiquement le texte à la TextView:

String toAdd = ""; 
for (int i=0; i < textViewHeight; i+= textHeight) 
    toAdd += fullText.subString(i, i+charactersPerLine); 
+0

Je ne sais pas combien de caractères j'ai par ligne. – jakk

+0

Vous pouvez le faire très facilement si vous utilisez une police monospace: http://en.wikipedia.org/wiki/Monospaced_font – Graeme

+0

Oui, mais les polices monospace ne sont pas belles. – jakk

0

Utilisation de la hauteur de la police modifier dynamiquement la hauteur de la vue, à savoir

Si votre texte est 10px élevé, votre TextView ne peut être 10, 20, 30px élevé. Cela ne vous oblige pas à avoir un style particulier de police.

+0

Cela semble bien, mais je ne peux pas faire ces choses dans un appwidget. Je pensais qu'il y a une propriété xml pour ça. – jakk

+0

Pourquoi ne pas le faire dans un AppWidget? Il n'y a pas d'attributs XML qui font ce que vous voulez - Si vous voulez que cela se produise, vous devrez travailler pour cela, j'ai peur. – Graeme

+0

Lorsque vous mettez à jour un AppWidget, vous ne connaissez pas la taille de votre vue. – jakk

0

Cette solution double la passe de mesure, mais parce que c'est une vue de texte sans enfant l'impact ne devrait pas être trop grande. Cela n'aidera pas non plus avec un widget, car il s'agit d'une vue de texte personnalisée. Pardon!

public class ExactWrappingTextView extends TextView{ 

public ExactWrappingTextView(Context context) { 
    super(context); 
} 
public ExactWrappingTextView(Context context, AttributeSet attrs){ 
    super(context, attrs); 
} 
public ExactWrappingTextView(Context context, AttributeSet attrs, 
     int defStyle) { 
    super(context, attrs, defStyle); 
} 

private int measureHeight; 
private int extraSpace; 

//This doubles the measure pass for this view... but we have to know how 
    //high it would have been before we can pull off the right amount 
public void onMeasure(int width, int height){ 
    super.onMeasure(width, height); 
    extraSpace = (getMeasuredHeight() - (getPaddingTop() + getPaddingBottom())) % getLineHeight(); 
    measureHeight = MeasureSpec.makeMeasureSpec(getMeasuredHeight() - extraSpace, MeasureSpec.AT_MOST); 
    super.onMeasure(width, measureHeight); 
} 

}

4

Je l'ai fait face à ce problème et a récemment utilisé une autre solution.

J'installe les maxLines dynamiquement:

final TextView tv = ((TextView) myLayout.findViewById(R.id.mytextview)); 
tv.setText(value); 
ViewTreeObserver vto = tv.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    private int maxLines = -1; 

    @Override 
    public void onGlobalLayout() { 
     if (maxLines < 0 && tv.getHeight() > 0 && tv.getLineHeight() > 0) { 
      int height = tv.getHeight(); 
      int lineHeight = tv.getLineHeight(); 
      maxLines = height/lineHeight; 
      tv.setMaxLines(maxLines); 
     } 
    } 
}); 
+0

a travaillé comme un charme merci buddy –

+0

Peut-être que c'est la bonne façon – chefish

Questions connexes