Android Resources.getIdentifier возвращает неправильное значение для пользовательского атрибута

Недавно я работал над проектом, в котором часто используется Resources.getIdentifier(). Все работает весело, но возникают проблемы, когда я пытаюсь использовать этот метод для извлечения пользовательских атрибутов.

Поэтому я объявляю некоторые атрибуты в xml

<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"/>

In FloatExpandMenuItem

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

ResourceUtils.getResId был оболочкой для Resources.getIdentifier, как это

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

И произошли странные вещи, я попытался отладить в FloatExpandMenuItem , ResourceUtils.getResId всегда возвращает 0 при получении атрибутов label,icon,showDot.

Поэтому мне было интересно, как мне изменить код, когда я пытаюсь работать с пользовательскими атрибутами при использовании Resources.getIdentifier()?


person 南风不竞    schedule 25.06.2016    source источник
comment
Возможно, это поможет вам: stackoverflow.com/questions/13816596 /   -  person R. Zagórski    schedule 25.06.2016
comment
@R.Zagórski Reflection — это наше окончательное решение, и нам удается это сделать, если мы не можем решить эту проблему до истечения срока. Но мне было интересно, почему пользовательские атрибуты не работают с этим методом или я использую этот метод неправильно?   -  person 南风不竞    schedule 25.06.2016