AttributeSet值返回@ 2131296269 - 它是什么以及如何使用?

时间:2013-05-01 13:01:47

标签: android xml

如果我在xml中定义一些视图,如:

        <com.android.view.AlphabetButton
            android:id="@+id/buttonA"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:texSize="@dimen/alphabet_button_text_size"/>

然后在init with AttributeSet:

public AlphabetButton(Context context, AttributeSet attrs) {
    super(context, attrs);

    if (attrs!=null){

        String textSizeAttribute = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "textSize");

textSizeAttribute值类似于:

  

05-01 16:00:21.154:I / AlphabetButton(8738):textSizeAttribute   @ 2131296269

我假设它类似于通过R到所需属性的链接。问题是如何评估它?我试过了:

if (textSizeAttribute.substring(0, 1).equals("@"))
                Log.i(this, "textSize is "+context.getResources().getDimension(Integer.valueOf(textSizeAttribute.substring(1))));

但这会返回错误的值。如果我将其定义为android:texSize="20sp"而不是@ dimen-link,那么textSizeAttribute会返回20.0sp,这是正确的。

更新
我做了一个研究,发现2131296269(0x7f09000d)链接到我的R.java中的正确值:

    public static final class dimen {
        public static final int alphabet_button_width=0x7f09000b;
        public static final int alphabet_button_height=0x7f09000c;
        public static final int alphabet_button_text_size=0x7f09000d;
...

和dimens.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <dimen name="alphabet_button_width">30dp</dimen>
    <dimen name="alphabet_button_height">30dp</dimen>
    <dimen name="alphabet_button_text_size">20sp</dimen>
    ...

但它返回30而不是定义20不能解释原因...这是日志输出:

05-01 16:18:14.284: I/AlphabetButton(9418): textSizeAttribute @2131296269 
05-01 16:18:14.284: I/AlphabetButton(9418): R.id is 2131296269 
05-01 16:18:14.284: I/AlphabetButton(9418): textSize is 30.0

和相应的代码行:

public AlphabetButton(Context context, AttributeSet attrs) {
    super(context, attrs);

    if (attrs!=null){

        String textSizeAttribute = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "textSize");
        Log.i(this, "textSizeAttribute "+textSizeAttribute);
        Log.i(this, "R.id is "+textSizeAttribute.substring(1));
        Log.i(this, "textSize is "+context.getResources().getDimension(Integer.valueOf(textSizeAttribute.substring(1))));

1 个答案:

答案 0 :(得分:0)

我也正在处理这个问题,并且很可能是android根据屏幕密度将原始值20缩放到30,在你的情况下很可能是240 DPI,这会产生比例因子1.5

http://www.androidtablets.net/forum/android-tablet-usage-tips-tricks/9444-lcd-density-explained.html    http://developer.android.com/guide/practices/screens_support.html

您可以通过打印以下显示指标来确认这些值 (在Mono / C#中,需要对原始Android / Java进行小翻译):

this.ApplicationContext.Resources.DisplayMetrics.Density;    this.ApplicationContext.Resources.DisplayMetrics.DensityDpi;    this.ApplicationContext.Resources.DisplayMetrics.Xdpi;    this.ApplicationContext.Resources.DisplayMetrics.Ydpi;    this.ApplicationContext.Resources.DisplayMetrics.WidthPixels;    this.ApplicationContext.Resources.DisplayMetrics.HeightPixels;