Android Resources.getIdentifier为自定义属性返回错误的值

时间:2016-06-25 03:47:19

标签: android xml android-custom-attributes

最近我正在开发一个使用<declare-styleable name="WemeFloatExpandMenuItem"> <attr name="label" format="string|reference"/> <attr name="icon" format="reference"/> <attr name="showDot" format="boolean"/> </declare-styleable> 的项目。所有工作都很有趣,但当我尝试使用此方法检索自定义属性时会出现问题。

所以我在xml中声明了一些属性

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minHeight="36dp"
    android:orientation="horizontal"
    android:showDividers="middle"
    android:divider="@drawable/weme_float_menu_divider"
    android:background="@drawable/weme_float_menu_bg">
    <com.weme.chat.FloatExpandMenuItem 
        android:id="@id/wemepay_float_menu_account"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        app:label="@string/wemepay_float_menu_title_account"
        app:icon="@drawable/weme_float_menu_account"/>

然后我在xml中应用此属性

TypedArray a = context.obtainStyledAttributes(attrs, ResourceUtils.getResIds(getContext().getPackageName(), "styleable", "WemeFloatExpandMenuItem"));
labelRes = a.getString(ResourceUtils.getResId(getContext(),"styleable","WemeFloatExpandMenuItem_label"));
iconRes = a.getDrawable(ResourceUtils.getResId(getContext(), "styleable", "WemeFloatExpandMenuItem_icon"));
showDot = a.getBoolean(ResourceUtils.getResId(getContext(), "styleable", "WemeFloatExpandMenuItem_showDot"), false);        
a.recycle();

在FloatExpandMenuItem中

public static int getResId(Context context, String resTypeName, String resName) {
    if (context == null) {
        return 0;
    }
    Resources res = context.getResources();
    String packageName = context.getPackageName();
    return res.getIdentifier(resName, resTypeName, packageName);
}

ResourceUtils.getResId是Resources.getIdentifier的包装器,就像这个

一样
>>> string = 'string'
>>> string[0:0] == ''
True
>>> string.index('str')
0
>>> string[string.index('str')] == 'str'
False

奇怪的事情发生了,我试图在FloatExpandMenuItem中调试,当检索标签,图标,showDot属性时,ResourceUtils.getResId总是返回0。

所以当我尝试使用Resources.getIdentifier()时尝试处理自定义属性时,我想知道如何更改代码?

0 个答案:

没有答案