我在自定义视图的构造函数中调用以下内容:
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)的变化会导致重大变化。
答案 0 :(得分:53)
请尝试以下方法:
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);
}
答案 1 :(得分:0)
@loeschg我遇到了同样的问题,但是我终于设法使用@plackemacher的回复来解决link
.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);
}