我想出了一个解决方案,我认为主要错误是我没有得到正确的 getIdentifier 包。
这是一些来源(可能有一些小错误,因为我不得不删除一些部分)。
我的自定义按钮(java):
public class CustomImageButton extends RelativeLayout
{
...
public CustomImageButton(Context context, AttributeSet attrs)
{
super(context, attrs);
LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inf.inflate( <my_xml_file> , this, true);
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.CustomImageButton);
CharSequence imageSrc = arr.getString(R.styleable.CustomImageButton_src);
if (imageSrc != null)
{
String fileName = new File("" + imageSrc).getName();
fileName = fileName.substring(0, fileName.indexOf("."));
int resId = getResources().getIdentifier(fileName, "drawable", <my_top_level_package_very_important_to_get_right>);
ImageButton button = ((ImageButton) findViewById(R.id.buttonImage));
button.setImageDrawable(getResources().getDrawable(resId));
}
}
...
}
然后在 attrs.xml 中,上面使用了“src”。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomImageButton">
<attr name="src" format="string" />
</declare-styleable>
...
</resources>
然后可以从布局 xml 中使用它,注意“xmlns:customimagebutton”:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:customimagebutton="http://schemas.android.com/apk/res-auto"
....>
<my.package.custom.MyCustomButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
customimagebutton:src="@drawable/my_image" />
</RelativeLayout>