Drawable.setState() 如何控制可绘制对象的特定状态?

19

我有一个类似这样的drawable:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true"
      android:state_window_focused="true"
      android:drawable="@drawable/seek_thumb_pressed" />

<item android:state_focused="true"
      android:state_window_focused="true"
      android:drawable="@drawable/seek_thumb_selected" />

<item android:state_selected="true"
      android:state_window_focused="true"
      android:drawable="@drawable/seek_thumb_selected" />

<item android:drawable="@drawable/seek_thumb_normal" />

在代码中,如何设置Drawable的特定状态?我想将其设置为state_pressed=true的状态。

2个回答

31

明白了。这里的一条评论帮了我:Android:如何以编程方式更新选择器(StateListDrawable)

Drawable.setState() 接受一个整数数组,这些整数表示可绘制对象的状态。您可以传递任何整数。一旦传递的整数与状态列表可绘制项匹配,可绘制对象就会在该状态下绘制。

在代码中更容易理解:

int[] state = new int[] {android.R.attr.state_window_focused, android.R.attr.state_focused};
minThumb.setState(state);

注意我的状态列表Drawable具有state_pressed="true"android:state_window_focused="true"。因此,我必须将这两个整数值都传递给setState。当我想要清除它时,我只需使用minThumb.setState(new int[]{});


如果当前视图没有背景,并且需要通知其子视图其状态(因为它们具有android:duplicateParentState="true"),该怎么办?你会如何更改视图的状态? - android developer
8
“在代码中更有意义” - 与可绘制状态无关的内容都没有意义... - milosmns
什么是minThumb? - Chris Watts

12

由于没有足够的积分来发表评论,所以这只是对android-developer所说的补充。 对于某些状态,例如state_enabled,没有明显的方法来设置该状态的相反值(例如没有state_disabled)。 要表示负面或相反的状态,请简单地传递该状态的资源的负值。

int[] state = new int[] {-android.R.attr.state_enabled}; //Essentially state_disabled

然后像往常一样将整数数组传递到setState()方法中。
minThumb.setState(state);

我没有测试过,但对我来说,没有state_enabled就会使用禁用状态的颜色。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接