以编程方式replaceselect器图像
我有一个ImageView有一个可绘制的图像资源设置为select器。 如何以编程方式访问select器并更改突出显示和非突出显示状态的图像?
这是一个select器的代码:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/iconSelector"> <!-- pressed --> <item android:state_pressed="true" android:drawable="@drawable/btn_icon_hl" /> <!-- focused --> <item android:state_focused="true" android:drawable="@drawable/btn_icon_hl" /> <!-- default --> <item android:drawable="@drawable/btn_icon" /> </selector>
我希望能够用其他图像replacebtn_icon_hl
和btn_icon
。
就我所能find的(我尝试做类似的事情),在已经定义了StateListDrawable之后,没有办法修改单个状态。 但是,您可以通过代码定义一个新的:
StateListDrawable states = new StateListDrawable(); states.addState(new int[] {android.R.attr.state_pressed}, getResources().getDrawable(R.drawable.pressed)); states.addState(new int[] {android.R.attr.state_focused}, getResources().getDrawable(R.drawable.focused)); states.addState(new int[] { }, getResources().getDrawable(R.drawable.normal)); imageView.setImageDrawable(states);
而且你可以只保留其中的两个,或者根据需要创build一个不同的。
我有同样的问题,并进一步解决这个问题。 唯一的问题是你不能在xml中指定NavStateListDrawable,所以你必须通过代码来设置UI元素的背景。 必须重写onStateChange方法,以确保每次更改主drawable的级别时,还要更新子级列表的级别。
当构buildNavStateListDrawable时,你必须通过你想要显示的图标的级别。
public class NavStateListDrawable extends StateListDrawable { private int level; public NavStateListDrawable(Context context, int level) { this.level = level; //int stateChecked = android.R.attr.state_checked; int stateFocused = android.R.attr.state_focused; int statePressed = android.R.attr.state_pressed; int stateSelected = android.R.attr.state_selected; addState(new int[]{ stateSelected }, context.getResources().getDrawable(R.drawable.nav_btn_pressed)); addState(new int[]{ statePressed }, context.getResources().getDrawable(R.drawable.nav_btn_selected)); addState(new int[]{ stateFocused }, context.getResources().getDrawable(R.drawable.nav_btn_focused)); addState(new int[]{-stateFocused, -statePressed, -stateSelected}, context.getResources().getDrawable(R.drawable.nav_btn_default)); } @Override protected boolean onStateChange(int[] stateSet) { boolean nowstate = super.onStateChange(stateSet); try{ LayerDrawable defaultDrawable = (LayerDrawable)this.getCurrent(); LevelListDrawable bar2 = (LevelListDrawable)defaultDrawable.findDrawableByLayerId(R.id.nav_icons); bar2.setLevel(level); }catch(Exception exception) { } return nowstate; } }
对于所有不同的导航button可绘制状态,我有如下所示。
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/top_bar_default" > </item> <item android:id="@+id/nav_icons" android:bottom="0dip"> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:maxLevel="0" > <bitmap android:src="@drawable/top_bar_icon_back" android:gravity="center" /> </item> <item android:maxLevel="1" > <bitmap android:src="@drawable/top_bar_icon_nav" android:gravity="center" /> </item> <item android:maxLevel="2" > <bitmap android:src="@drawable/top_bar_icon_settings" android:gravity="center" /> </item> <item android:maxLevel="3" > <bitmap android:src="@drawable/top_bar_icon_search" android:gravity="center" /> </item> </level-list> </item> </layer-list>
我打算把这个问题作为一个问题和答案发布,但是当你提出这个问题的时候,看到这个问题。 请注意,这为您节省了许多xml文件定义。 我从大约50-100 xml的定义下降到大约4!