web-dev-qa-db-fra.com

Italic TextView avec wrap_contents semble couper le texte sur le bord droit

<TextView Android:id="@+id/prodLbl"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_centerVertical="true"
    Android:textColor="#FFFFFF"
    Android:textSize="30dip"
    Android:textStyle="italic"
    Android:text="Magnifico"
    />

Semble couper quelques pixels du personnage le plus à droite, au moins sur un émulateur 480x800 ou Nexus One.

Pour moi, cela ressemble à un bug, mais je ne suis qu'un débutant sous Android. J'ai essayé d'ajouter des marges à gauche et à droite, mais cela continuait à couper. En fin de compte, mon but était d'ajouter un seul espace des deux côtés du texte. Toute autre solution?

49
Grego

Vous pouvez également utiliser le caractère Unicode d'espacement absolu } _ (\ u00A0).

21
Sam

Android:layout_width="wrap_content", vous donne un rectangle pour le rendu du contenu encapsulé. Tout fonctionnera bien pour un texte normal (non italique).

Une fois que vous avez activé le texte italic, le texte enveloppé essaiera de tenir dans le rectangle et le caractère le plus à droite sera alors coupé sauf s'il est non coupable (tel que ., ), 1, etc.).

La solution suggérée est d'avoir un espace à la fin du texte (ou quelque chose de mieux ??)

PS: Ceci s'applique également à Android:gravity="right" car le texte sera poussé à l'extrême droite. Si nous avons du texte italic, nous sommes confrontés au même problème.

19
danfelabs

J'ai ajouté " \" à la fin de toutes les chaînes de mon chaîne.xml. \ est le caractère d'échappement, donc de cette façon je pourrais venir sur le problème, mais cette solution est méchante. J'espère que cela t'aides.

12
Xtera

Ajoutez simplement un espace supplémentaire à la fin du texte. En XML, vous devrez ajouter \u0020 à la fin, sinon XML ignore les espaces au début/à la fin par défaut.

5
Oleg Vaskevich

Une autre solution a été trouvée (testée sur 4.1.2 et 4.3 en utilisant wrap_content). Si vous étendez la classe TextView ou EditText, vous pouvez remplacer la méthode onMeasure de cette façon:

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    final int measuredWidth = getMeasuredWidth();
    final float tenPercentOfMeasuredWidth = measuredWidth * 0.1f;
    final int newWidth = measuredWidth + (int) tenPercentOfMeasuredWidth;

    setMeasuredDimension(newWidth, getMeasuredHeight());
}
4
kamil zych

Vous pouvez ajouter un espace de cheveux à votre chaîne

<string name="hair_space">&#x200A;</string>

String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)
3
Frank Nguyen

Cela s'applique également aux TextViews à largeur fixe, et pas seulement à "wrap_content". Je ne sais pas si le problème est spécifique à la version, comme certains commentateurs l'ont mentionné. Je vois le problème sur toutes les versions de Honeycomb. D'après ce que j'ai vu, le problème ne disparaît pas en définissant des marges, un remplissage, en utilisant une police de caractères à largeur fixe ou personnalisée.

2
Tenacious

En regardant la source, j'ai découvert que le fait de définir une ombre étendait le rectangle du clip.

Une astuce consiste à définir une ombre invisible juste au-delà du personnage.

Par exemple:

Android:shadowRadius="2"
Android:shadowDx="2"
Android:shadowColor="#00000000"

Je pense que cette solution est meilleure car elle n'augmentera pas la largeur de la variable TextView, ce qui peut arriver lors de l'ajout d'un caractère supplémentaire (ce qui est plus apparent avec un arrière-plan).

1
Che Jami

Voici ma solution: Formater textview et mesurer. Après cela, définissez la largeur de textview avec 1 pixel, ajoutez à la largeur mesurée.

TextView textView = new TextView(this);
textView.setText("Text blah blah");
textView.setTypeface(typeface, Typeface.BOLD_ITALIC)
textView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
textView.setLayoutParams(new LayoutParams(textView.getMeasuredWidth() + 1, 
                                             LayoutParams.WRAP_CONTENT));

Travailler pour moi J'espère que ces aide.

1
lee

Une solution propre et propre:

Utilisez une police personnalisée en italique au lieu de définir textStyle = 'italic' Par exemple:

<Android.support.v7.widget.AppCompatTextView
            Android:text="yolO"
            app:fontFamily="@font/roboto_italic"/>

Je n'ai pas essayé sur TextView standard, mais d'après mes observations, le problème est avec textStyle = 'italic'.

Fonctionne sans aucun piratage!

Voici une preuve d'attribut de blaming textStyle:

J'ai créé une police de caractères fontFamily et définie pour les caractères normaux, gras et italiques.

res/font/app_font_family.xml

<font-family xmlns:app="http://schemas.Android.com/apk/res-auto">
    <font app:fontStyle="normal" app:fontWeight="400" app:font="@font/roboto_regular"/>
    <font app:fontStyle="italic" app:fontWeight="400" app:font="@font/roboto_italic" />
    <font app:fontStyle="normal" app:fontWeight="700" app:font="@font/roboto_medium"/>
</font-family>

Maintenant, lorsque j'utilise cette fontFamily et que j'applique textStyle = 'italic', le caractère le plus à droite est toujours tronqué.

<Android.support.v7.widget.AppCompatTextView
            Android:text="yolO"
            app:fontFamily="@font/app_font_family"
            Android:textStyle='italic' />

Ceci est sur Api 23 avec la bibliothèque de support 28.0.0 et Android Studio 3.2

0
sziraqui

J'ai également eu le même problème et utilisé une entité d'espace insécable via HTML:

textView.setText("Magnifico" + Html.fromHtml("&nbsp;");
0
Bryan Ibrahim

Ajoutez un remplissage 3DP à droite sur votre TextView. J'ai essayé avec 1dp et 2dp, mais 3dp semblait faire l'affaire pleinement.

Android:paddingRight="3dp"

0
user750023