Нужен идентификатор изображения из пользовательского виджета атрибутов 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;
  }
}

person Peri Hartman    schedule 10.08.2012    source источник


Ответы (2)


Если вы хотите получить возможность рисования, используйте TypedArray.getDrawable(). В вашем примере вы используете getString().

В вашем declare-styleable использовании

   <attr name="srcPressed" format="reference" /> 
person Diego Torres Milano    schedule 10.08.2012
comment
Это имеет смысл. Однако как мне передать идентификатор в getDrawable? Я попробовал a.getDrawable (R.attr.srcPressed), но это не удалось с исключением. - person Peri Hartman; 11.08.2012
comment
Как вы объявили свои атрибуты (declare-styleable)? - person Diego Torres Milano; 11.08.2012
comment
Пожалуйста, смотрите выше; Я добавил в блок xml и добавил attrs.xml - person Peri Hartman; 11.08.2012
comment
Да! Это работает. Думаю, я еще не нашел достаточно документации по attrs.xml; будет читать дальше. (Для будущих зрителей этого поста я обновил исходный пост рабочим кодом.) - person Peri Hartman; 12.08.2012

Если вам нужен фактический идентификатор ресурса для 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 );
person Adam    schedule 26.09.2014