web-dev-qa-db-ja.com

wrap_contentsを含むイタリックTextViewは、右端のテキストをクリップするようです

<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"
    />

少なくとも480x800エミュレーターまたはNexusOneでは、右端の文字から数ピクセルをクリップしているようです。

私にはそれはバグのように見えますが、私は単なるAndroid=初心者です。左と右にマージンを追加しようとしましたが、それでもクリッピングが続いています。結局私のハックテキストの両側に単一のスペースを追加することでした。他の解決策はありますか?

53
Grego

nicodeの改行なしスペース文字 (\ u00A0)を使用することもできます。

21
Sam

Android:layout_width="wrap_content"は、ラップされたコンテンツのレンダリング用の長方形を提供します。すべてが通常のテキスト(イタリック以外)でうまく機能します。

italicテキストを有効にすると、折り返されたテキストは四角形に収まるように試行されるため、カットできないもの(.)1など)を除いて、右端の文字が切り取られます。

提案されている解決策は、テキストの最後にスペースを入れることです(またはもっと良い??)

PS:テキストは右端にプッシュされるため、これはAndroid:gravity="right"にも適用されます。 italicテキストがある場合、同じ問題に直面します。

20
danfelabs

追加した " \"strings.xml内のすべての文字列の終わり。 \はエスケープ文字なので、この方法で問題を解決できますが、この解決策は厄介です。お役に立てれば。

12
Xtera

テキストの最後に余分なスペースを追加するだけです。 XMLでは、末尾に\u0020を追加する必要があります。そうしないと、XMLはデフォルトで先頭/末尾の空白を無視します。

6
Oleg Vaskevich

別の解決策を見つけました(wrap_contentを使用しながら4.1.2および4.3でテスト済み)。 TextViewまたはEditTextクラスを拡張する場合は、次のようにしてonMeasureメソッドをオーバーライドできます。

@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

文字列にヘアスペースを追加できます

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

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

これは、「wrap_content」だけでなく、固定幅のTextViewにも当てはまります。一部のコメンターが言及したように、問題がバージョン固有であるかどうかはわかりません。すべてのHoneycombバージョンで問題が発生します。私が見てきたことから、マージンの設定、パディング、固定幅の使用、またはイタリックのカスタム書体によって問題が解消されることはありません。

2
Tenacious

適切でクリーンな解決策:

TextStyle = 'italic'を設定する代わりに、イタリックのカスタムフォントを使用します。例:

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

私は通常のTextViewでそれを試していませんが、私の観察から、問題はtextStyle = 'italic'にあります。

ハックなしで動作します!

これがtextStyle属性のせいの証拠です:

カスタムfontFamilyを作成し、通常、太字、斜体の書体を定義しました

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>

このfontFamilyを使用してtextStyle = 'italic'を適用すると、右端の文字がまだクリップされます。

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

これは、サポートライブラリ28.0.0およびAndroid Studio3.2を備えたApi23上にあります

1
sziraqui

ソースを見ると、シャドウを設定するとクリップの長方形が拡張されることがわかりました。

秘訣は、キャラクターのすぐ先に見えない影を設定することです。

例えば:

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

余分な文字を追加するときに発生するTextViewの幅を拡張しないため、この解決策の方が良いと思います(背景を使用するとより明確になります)。

1
Che Jami

これが私の解決策です:テキストビューのフォーマットと測定。その後、1ピクセルでテキストビューの幅を設定し、測定された幅に追加します。

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

私のために働いています。これらの助けを願っています。

1
lee

私も同じ問題を抱えており、HTMLを介してノーブレークスペースエンティティを使用しました。

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

TextViewの右側に3 dpのパディングを追加します。 1dpと2dpで試してみましたが、3dpで十分にうまくいったようです。

Android:paddingRight="3dp"

0
user750023

プログラムで斜体を適用すると、コンテンツの折り返しが正しく行われるように思われます。したがって、TextViewの書体を手動で設定します。 kotlinで:

textView.typeface = Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)
0
kalnar