最近、私はたくさん使うプロジェクトに取り組んでいました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"/>
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 でデバッグしようとしましたが、ラベル、アイコン、showDot 属性を取得するときに ResourceUtils.getResId は常に 0 を返します。
Resources.getIdentifier() を使用するときにカスタム属性を処理しようとするときに、コードをどのように変更する必要があるのか 疑問に思っていましたか?