web-dev-qa-db-ja.com

カスタムビューでテキストサイズを設定すると、巨大なテキストが表示される

カスタムビューのコンストラクターで次を呼び出しています。

private void style(Resources.Theme theme, AttributeSet attrs) {
    TypedArray a = theme.obtainStyledAttributes(
            attrs,
            R.styleable.StackedTextView,
            0, 0);

    try {
        DebugTool.assertTrue(holdr != null, "View holder has not been properly intialized.");
        String line1 = a.getString(R.styleable.StackedTextView_line1);
        setLine1(line1);
        String line2 = a.getString(R.styleable.StackedTextView_line2);
        setLine2(line2);

        line1Size = a.getDimension(R.styleable.StackedTextView_line1_textSize, 20);
        line2Size = a.getDimension(R.styleable.StackedTextView_line2_textSize, 20);
        if (line1Size > 0) {
            holdr.textLine1.setTextSize(line1Size);
        }
        if (line2Size > 0) {
            holdr.textLine2.setTextSize(line2Size);
        }

    } finally {
        a.recycle();
    }
}

2つのテキストフィールドにテキストとテキストサイズを設定することになっています。

テキストコンテンツの文字列形式に加えて、attr.xmlに次のものが含まれています(これは正常に機能します)。

    <attr name="line1_textSize" format="dimension" />
    <attr name="line2_textSize" format="dimension" />

このビューを使用し、xmlを介してディメンションを使用してテキストサイズを設定すると、

        <com.me.app.view.component.StackedTextView
            Android:id="@+id/overview_total_reviews"
            app:line1="40"
            app:line2="Rating"
            style="@style/OverviewStackedText"
            app:line1_textSize="10sp"
            app:line2_textSize="12sp"
            />

テキストは、予想よりも大幅に大きくなります。設定するのはそれぞれ10と12 spだけで、テキストサイズは30 spに近いです。

誰かが私が間違っていることを見ることができますか?物事が適切にスケーリングされていることを確認するために、DisplayMetricsで何かをする必要がありますか?

編集:明確化の追加

ディメンションIS取得されます。カスタム属性(xml内)を使用して異なるテキストサイズを設定すると、テキストが変更されます。また、getDimensionPixelSizeを使用してみました。

計算/次元の取得が間違っているかのようです。 1sp(またはdp)の変化は、大きな変化をもたらします。

42
loeschg

代わりに以下を試してください。

line1Size = a.getDimensionPixelSize(R.styleable.StackedTextView_line1_textSize, 0);
line2Size = a.getDimensionPixelSize(R.styleable.StackedTextView_line2_textSize, 0);

if (line1Size > 0) {
    holdr.textLine1.setTextSize(TypedValue.COMPLEX_UNIT_PX, line1Size);
}
if (line2Size > 0) {
    holdr.textLine2.setTextSize(TypedValue.COMPLEX_UNIT_PX, line2Size);
}
63
plackemacher

@loeschg同じ問題がありましたが、最終的には@plackemacherの返信を使用して解決できました link

メソッド.getDimensionPixelSizealways()はピクセル単位で値を返すため、dp値を取得するには、convertPixelsToDpメソッドを使用する必要があります。

ここにあなたを助けることができるコードがあります:

 /**
 * This method converts device specific pixels to density independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent dp equivalent to px value
 */
public static float convertPixelsToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

line1Size = convertPixelsToDp(a.getDimensionPixelSize(R.styleable.StackedTextView_line1_textSize, 0), some_context);
line2Size = convertPixelsToDp(a.getDimensionPixelSize(R.styleable.StackedTextView_line2_textSize, 0), some_context);

if (line1Size > 0) {
    holdr.textLine1.setTextSize(TypedValue.COMPLEX_UNIT_PX, line1Size);
}
if (line2Size > 0) {
    holdr.textLine2.setTextSize(TypedValue.COMPLEX_UNIT_PX, line2Size);
}
0
Daniel Luche