在自定义视图中设置文本大小导致文本过大。

56

我正在自定义视图的构造函数中调用以下内容:

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和12sp,但文本大小更接近于30sp。

有人能看出我做错了什么吗?我需要在DisplayMetrics中做些什么,以确保正确缩放吗?

编辑:添加一些说明

尺寸确实被获取到了。当我使用自定义属性(在xml中)设置不同的文本大小时,文本确实会发生变化。我还尝试使用getDimensionPixelSize

就好像计算/尺寸检索错误一样。1sp(或dp)的变化会导致显著的变化。

2个回答

92

请尝试以下方法:

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

5
为了对这个正确的解决方案进行一些澄清,我需要先获取像素维度,然后通过传递第二个参数中我正在传递的维度的单位/类型来设置文本大小。哎呀。 - loeschg
3
我的错。默认的setTextSize()使用了COMPLEX_UNIT_SP,导致了这个错误。 - Weekend

2

@loeschg 我曾经遇到过同样的问题,但是最终我通过使用 @plackemacher 的回答并参考了这个链接解决了问题。

方法 .getDimensionPixelSizealways() 返回像素值,所以您需要使用convertPixelsToDp方法来获取dp值。

以下是可以帮助您的代码:

"最初的回答"
 /**
 * 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接