问题
<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"
/>
Seems to clip few pixels from the rightmost character, at least on 480x800 emulator or Nexus One.
To me it looks like a bug, but I'm just an Android beginner. I tried to add margins to left and right, but it still kept on clipping. In the end my hack around it was to add a single space on both sides of the text. Any other solutions?
回答1:
You could also use the Unicode no-break space character (\u00A0).
回答2:
android:layout_width="wrap_content"
, gives you a rectangle for wrapped content rendering.
All will work well for normal text (non-italic).
Once you have italic
text enabled, the wrapped text will try to fit into the rectangle and hence the rightmost character will be cut off unless its un-cut-able (such as .
, )
, 1
, etc.)
Solution as suggested is to have a space at the end of the text (or anything better ??)
PS: This applies to android:gravity="right"
too because the text will be pushed to the rightmost. If we have italic
text, we face the same problem.
回答3:
I added " \"
to end of all strings in my strings.xml. \
is the escape character, so this way I could come over the issue, but this solution is nasty. Hope this helps.
回答4:
Just add an extra space to the end of the text. In XML, you will have to add \u0020
to the end as otherwise XML ignores whitespace at the beginning/end by default.
回答5:
Found another solution (tested on 4.1.2 and 4.3 while using wrap_content
). If you extend TextView
or EditText
class you can override onMeasure
method this way:
@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());
}
回答6:
You can add a HAIR SPACE to your string
<string name="hair_space"> </string>
String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)
回答7:
This applies to fixed-width TextViews also, not just "wrap_content". I'm not sure if the issue is version-specific as some commenters have alluded to. I see the issue on all Honeycomb versions. From what I've seen the issue does not go away by setting margin, padding, using a fixed-width, or a true-italic custom typeface.
回答8:
Looking at the source I found out that setting a shadow extends the clip rectangle.
A trick is to set an invisible shadow just beyond the character.
For example:
android:shadowRadius="2"
android:shadowDx="2"
android:shadowColor="#00000000"
I think this solution is better as it will not extend the width of the TextView
which may happen when adding an extra character (which is more apparent with a background).
回答9:
This is my solution: Format textview and measure. After that set width of textview with 1 pixel add to the width measured.
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));
Working for me. Hope these help.
回答10:
A proper and clean solution:
Use an italic custom font instead of setting textStyle='italic' For example:
<android.support.v7.widget.AppCompatTextView
android:text="yolO"
app:fontFamily="@font/roboto_italic"/>
I haven't tried it on regular TextView but from my observations, the problem is with textStyle='italic'.
Works without any hack!
Here's a proof of blaming textStyle attribute:
I made a custom fontFamily and defined typeface for normal, bold and italic
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>
Now when I use this fontFamily and apply textStyle='italic', the rightmost character is still clipped.
<android.support.v7.widget.AppCompatTextView
android:text="yolO"
app:fontFamily="@font/app_font_family"
android:textStyle='italic' />
This is on Api 23 with support library 28.0.0 and Android Studio 3.2
回答11:
I also had the same issue and used a non-breaking space entity via HTML:
textView.setText("Magnifico" + Html.fromHtml(" ");
回答12:
It seems to me that if you apply italic programatically, it does content wrapping correctly. So set the typeface of the TextView manually, e.g. in kotlin:
textView.typeface = Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)
回答13:
Add a 3dp padding to the right on your TextView. I tried with 1dp and 2dp, but 3dp seemed to do the trick fully.
android:paddingRight="3dp"
来源:https://stackoverflow.com/questions/4353836/italic-textview-with-wrap-contents-seems-to-clip-the-text-at-right-edge