如何允许自定义View的XML属性由资源ID或值指定?

Xåp*_* - 4 android attributes android-custom-view android-layout android-xml

我正在实现我自己的自定义DialogPreference子类,如下所示:

public class MyCustomPreference extends DialogPreference
{
    private static final String androidns = "http://schemas.android.com/apk/res/android";

    private String mDialogMsg;

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

        mDialogMsg = attrs.getAttributeValue(androidns, "dialogMessage");

        ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我获取dialogMessageXML属性并将其保存在成员变量中mDialogMsg.

我的问题是:我当前的代码不允许将dialogMessageXML属性指定为XML中的字符串资源ID.

换句话说,这有效:

android:dialogMessage="Hello world!"
Run Code Online (Sandbox Code Playgroud)

但这不是:

android:dialogMessage="@string/hello_world"
Run Code Online (Sandbox Code Playgroud)

如果我在XML中将其指定为资源ID,则会将资源ID保存到mDialogMsg,而不是字符串资源本身.现在,我知道我能做到:

context.getString(attrs.getAttributeValue(androidns, "dialogMessage"))
Run Code Online (Sandbox Code Playgroud)

但是,用户将无法在XML中输入正常的字符串(即非资源ID).我想让用户选择同时执行这两项操作.我该怎么做呢?

fay*_*lon 6

int resId = attrs.getAttributeResourceValue(androidns, "dialogMessage", 0);
if(resId != 0){
    mDialogMsg = getContext().getResources().getString(resId);
} else{
    mDialogMsg = attrs.getAttributeValue(androidns, "dialogMessage");
}
Run Code Online (Sandbox Code Playgroud)