Глядя на отличный пример Марка Мерфи на http://github.com/commonsguy/cw-advandroid/tree/master/Views/ColorMixer/, вы можете увидеть, где он определил пользовательский виджет под названием ColorMixer. ColorMixer имеет атрибут с именем «initialColor», объявленный в attrs.xml.
В конструкторе для ColorMixer он получает значение атрибута следующим образом:
TypedArray a=getContext()
.obtainStyledAttributes(attrs, R.styleable.ColorMixer, 0, 0);
color = a.getInt(R.styleable.ColorMixer_initialColor, 0xFFA4C639);
a.recycle();
Это работает просто отлично, если 'R' доступен для ColorMixer. Это будет иметь место, если ColorMixer написан для и скомпилирован с любым пакетом, частью которого он будет.
Но что, если бы я хотел, чтобы ColorMixer был более полезным? Я хочу использовать тот же источник, неизмененный, или даже, может быть, положить его в файл JAR. Это означает, что вы не можете ссылаться на 'R'.
Мне кажется, я должен быть в состоянии сделать что-то вроде
TypedArray a=getContext()
.obtainStyledAttributes(attrs, what-do-I-do-here?, 0, 0);
int resid = context.getResources().getIdentifier("ColorMixer_initialColor",
"attr", "com.commonsware.android.colormixer.ColorMixer")
color = a.getInt(resid, 0xFFA4C639);
но getIdentifier никогда не возвращает ничего, кроме нуля. Есть ли что-то еще, что я должен делать? Я хочу переписать этот код, чтобы он полностью не зависел от 'R'
Исходный код конкретного примера см. На сайте www.efalk.org/tmp/CustomWidget.tar.gz
.