Нужен идентификатор изображения из xml-атрибутов собственного виджета
У меня есть пользовательский элемент управления (очень простой на данный момент), который похож на кнопку. Нужно отображать несжатое и нажатое изображение. Он появляется несколько раз в упражнении и имеет разные пары изображений в зависимости от того, где он используется. Подумайте о значках панели инструментов - похоже на это.
Вот выдержка из моего макета:
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:MyApp="http://schemas.android.com/apk/res/com.example.mockup"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableRow>
<com.example.mockup.ImageGestureButton
android:id="@+id/parent_arrow"
android:src="@drawable/parent_arrow"
MyApp:srcPressed="@drawable/parent_arrow_pressed"
... />
...
</TableRow>
</TableLayout>
attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ImageGestureButton">
<attr name="srcPressed" format="reference" />
</declare-styleable>
</resources>
И в R.java можно найти:
public static final class drawable {
public static final int parent_arrow=0x7f020003;
public static final int parent_arrow_pressed=0x7f020004;
...
}
Во время создания виджета я хочу определить идентификаторы, объявленные в действии xml. Как я могу это сделать? Я попробовал это (я обновил свой оригинальный пост с рабочим кодом; так, работает следующее)
public class ImageGestureButton extends ImageView
implements View.OnTouchListener
{
private Drawable unpressedImage;
private Drawable pressedImage;
public ImageGestureButton (Context context, AttributeSet attrs)
{
super(context, attrs);
setOnTouchListener (this);
unpressedImage = getDrawable();
TypedArray a = context.obtainStyledAttributes (attrs, R.styleable.ImageGestureButton, 0, 0);
pressedImage = a.getDrawable (R.styleable.ImageGestureButton_srcPressed);
}
public boolean onTouch (View v, MotionEvent e)
{
if (e.getAction() == MotionEvent.ACTION_DOWN)
{
setImageDrawable (pressedImage);
}
else if (e.getAction() == MotionEvent.ACTION_UP)
{
setImageDrawable (unpressedImage);
}
return false;
}
}
2 ответа
Если вы хотите получить отрисовку, используйте TypedArray.getDrawable (). В вашем примере вы используете getString().
В вашем declare-styleable
использование
<attr name="srcPressed" format="reference" />
Если вам нужен фактический идентификатор ресурса для Drawable, а не полностью разрешенный Drawable сам по себе, вы можете сделать это:
TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.FooLayout );
TypedValue value = new TypedValue();
a.getValue( R.styleable.FooLayout_some_attr, value );
Log.d( "DEBUG", "This is the actual resource ID: " + value.resourceId );