Могу ли я использовать селектор, который можно рисовать с LinerLayout, для представления разных состояний?

У меня есть пользовательский компонент, представляющий собой комбинацию LinearLayout + ImageViewx2 + TextView. Пользовательский компонент является интерактивным, и я хотел бы показать пользователю визуальную обратную связь, когда он нажимает на него, мигая оранжевым фоном, похожим на кнопку. Я создал следующий рисунок, надеясь использовать разные стили в зависимости от внутреннего состояния компонента. Вот рисунок:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_pressed="true" android:drawable="@drawable/sunshine_gradient" />
   <item android:state_focused="true" android:drawable="@drawable/winter_background" />
   <item android:drawable="@drawable/component_background" />
</selector>

Я также определил стиль, который ссылается на рисуемый объект:

<style name="navigation_item" parent="android:Theme.Dialog">
    <item name="android:background">@drawable/navigation_item</item>
</style>

Затем присвоил это компоненту, используя:

<?xml version="1.0" encoding="utf-8"?>

<merge xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_height="wrap_content"
   android:layout_width="fill_parent"
   android:padding="5dp"
   android:orientation="horizontal"
   android:clickable="true"
   style="@style/navigation_item">

<ImageView android:id="@+id/navigationIcon"
           android:layout_height="wrap_content"
           android:layout_width="wrap_content"
           android:layout_marginRight="5dp"/>

<TextView android:id="@+id/navigationTitle"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_vertical"
          android:layout_weight="1.0"
          android:singleLine="true"
          style="@style/favoriteTitle"
          android:layout_marginRight="5dp"/>

<ImageView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:src="@drawable/right_arrow"/>
</merge>

Мой код компонента:

public class NavigationItem extends LinearLayout {

public NavigationItem(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOrientation(HORIZONTAL);
    setGravity(Gravity.CENTER);
    setWeightSum(1.0f);
    setClickable(true);

    LayoutInflater.from(context).inflate(R.layout.navigation_item, this, true);

    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.NavigationItem, 0, 0 );

    String title = array.getString(R.styleable.NavigationItem_title);
    if( title == null ) title = "";
    ((TextView)findViewById(R.id.navigationTitle)).setText(title);

    Drawable icon = array.getDrawable(R.styleable.NavigationItem_icon);
    if( icon != null ) {
        ((ImageView)findViewById(R.id.navigationIcon)).setImageDrawable(icon);
    }

    array.recycle();
}

}

Похоже, что компонент подбирает рисуемый объект, поскольку по умолчанию он имеет @drawable/component_background. Он не работает, когда я нажимаю на него. Я не вижу изменения состояния на нажатие или фокусировку. Можно ли это сделать по умолчанию LinearLayout?


person chubbsondubs    schedule 17.07.2011    source источник


Ответы (1)


Похоже, я сам отвечу на этот вопрос. Оказывается, тег слияния не может указать атрибут стиля в этом теге. Поэтому, указав стиль использования NavigationItem в XML или в коде, все это работает.

person chubbsondubs    schedule 17.07.2011