以编程方式将选择器xml资源设置为可绘制到ImageView不起作用

时间:2015-05-22 04:33:25

标签: android android-layout android-activity android-resources

我需要使用图标及其标题填充ListView。我已经在菜单图标及其标题的资源中创建了数组:

对于标题:

   <array name="menu_title_array">
         <item>@string/menu_name_text</item>
    </array>

对于图标:

<array name="menu_icons_array">
     <item>@drawable/menu_icon_name</item>
</array>

我使用xml选择器drawable为每个图标创建了一个drawable,如:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/icon_name_disabled" android:state_enabled="false"/>
    <item android:drawable="@drawable/icon_name_press" android:state_pressed="true"/>
    <item android:drawable="@drawable/icon_name_press" android:state_activated="true"/>
    <item android:drawable="@drawable/icon_name"/>
</selector>

现在我正在创建一个MenuItem列表,其中包含titledrawable来自我创建的数组menu_title_arraymenu_icons_array,如:

       TypedArray titles = getResources().obtainTypedArray(R.array.menu_title_array);
        TypedArray icons = getResources().obtainTypedArray(R.array.menu_icons_array);
for (int index = 0; index < menuRowText.length(); mainMenuIndex++) {
    menuRowItemList.add(new MenuRowItem(icons.getDrawable(index), titles.getString(index ));
}

现在我在适配器getView()方法中设置标题及其图标,如下所示:

title.setText(menuItem.getTitle());
icon.setImageDrawable(menuItem.getDrawable());

现在,如果我选择一个菜单项,那么图标的状态应该根据我为它创建的<selector>而改变。 但它没有改变它的状态。

如果我为每个菜单项创建StateListDrawable,例如:

StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed},
       mContext.getResources().getDrawable(R.drawable.icon_name_press));
states.addState(new int[] {android.R.attr.state_activated},
       mContext.getResources().getDrawable(R.drawable.icon_name_press));
states.addState(new int[] { },
       mContext.getResources().getDrawable(R.drawable.icon_name));

并将其应用于列表图标,如:

icon.setImageDrawable(states);

然后它正常工作,因为它正在更改状态已激活,按下。

请告知我出错的地方,我不想为每个MenuItem使用StateListDrawable创建图标drawable,因为app中会有很多样板代码。

使用List<MenuRowItem>填充ListView。以下是pojo的结构:

class MenuRowItem {
    private Drawable drawable;
    private String title;

MenuRowItem(Drawable drawable, String title) {
    this.drawable = drawable;
    this.title = title;
}

public Drawable getDrawable() {
        return drawable;
}

public String getText() {
        return mText;
}

如果需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

通过将cities_with_uniq_friend_names id保留在drawable而非保留MenuRowItem对象来解决问题。

现在是Drawable的POJO:

MenuRowItem

我保持class MenuRowItem { private int drawableResourceId; private String title; MenuRowItem(int resourceId, String title) { this.drawableResourceId = resourceId; this.title = title; } public int getResourceId() { return drawableResourceId; } public String getText() { return mText; } } 损失的状态,同时保持drawable作为对象。 因此,我在POJO中保留了drawable的resourceId,并使用以下方法将drawable设置为适配器中的ImageView:

Drawable(enable, activated, normal)

希望它会对某人有所帮助。如果需要更多信息,请告诉我