这些略有不同的州抽象的任何行为差异?

Ric*_*ral 8 android android-selector android-drawable

Q1)查看原始ListView状态drawable listSelector我们有这样的东西(我剥离了一些代码来简化示例):

<selector>
    <item android:drawable="<TRANSPARENT>" android:state_window_focused="false"/>
    <item android:drawable="<DRAWABLE_1>" android:state_focused="true" android:state_pressed="true"/>
    <item android:drawable="<DRAWABLE_1>" android:state_focused="false" android:state_pressed="true"/>
    <item android:drawable="<DRAWABLE_2>" android:state_focused="true"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

但我一直在我的应用程序上这样做:

<selector>
    <item android:drawable="<DRAWABLE_2>" android:state_pressed="false" android:state_focused="true"/>
    <item android:drawable="<DRAWABLE_1>" android:state_pressed="true"/>
    <item android:drawable="<TRANSPARENT>" />
</selector>
Run Code Online (Sandbox Code Playgroud)

这似乎产生了相同的结果,而且更加简单.你是否注意到第一个比我自己的版本更好的情况?我只是想确保我没有遗漏一些重要因素,因为我希望尽可能缩短我的代码...

Q2)我看到许多州的drawables <item android:drawable="<TRANSPARENT>" android:state_window_focused="false"/>作为顶级项目,但我不明白为什么需要它.该state_window_focused总是弄得我有点...是不是真的有必要吗?

g00*_*0dy 2

我必须将其放入答案中,尽管我不确定,但这就是我的想法:

我将从 Q2 开始:

state_window_focused对应于默认行为(“窗口”可见,但未聚焦),我认为它只是用来指出默认行为(TRANSPARENT)。

关于第一季度:

DRAWABLE2将在两种情况下以及相同的条件下可视化 - 聚焦和未按下,因为:

第一种情况:

<item android:drawable="<DRAWABLE_2>" android:state_focused="true"/>
Run Code Online (Sandbox Code Playgroud)

第二种情况:

`<item android:drawable="<DRAWABLE_2>" android:state_focused="true" android:state_pressed="false"/>`
Run Code Online (Sandbox Code Playgroud)

我们有 D2,虽然专注,但在你的情况下,也没有压力。

DRAWABLE1仅在每种情况下按下时才可见。不同之处在于,在第一种情况下,还给出了两个附加状态android:state_focused="true/false",这没有任何意义,因此情况 1 中的两行可以缩小为一个(正是您所拥有的):

<item android:drawable="<DRAWABLE_1>"  android:state_pressed="true"/>
Run Code Online (Sandbox Code Playgroud)

所以,总结一下:

案例 1 - 您有:

<selector>
    <item android:drawable="<TRANSPARENT>" android:state_window_focused="false"/>
    <item android:drawable="<DRAWABLE_1>" android:state_focused="true" android:state_pressed="true"/>
    <item android:drawable="<DRAWABLE_1>" android:state_focused="false" android:state_pressed="true"/>
    <item android:drawable="<DRAWABLE_2>" android:state_focused="true"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

这相当于:

<selector>
    <item android:drawable="<TRANSPARENT>" android:state_window_focused="false"/>
    <item android:drawable="<DRAWABLE_1>"  android:state_pressed="true"/>
    <item android:drawable="<DRAWABLE_2>"  android:state_focused="true"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

和你的案例(案例2)进行比较:

<selector>
    <item android:drawable="<DRAWABLE_2>" android:state_pressed="false" android:state_focused="true"/>
    <item android:drawable="<DRAWABLE_1>" android:state_pressed="true"/>
    <item android:drawable="<TRANSPARENT>" />
</selector>
Run Code Online (Sandbox Code Playgroud)

到目前为止我能看到的唯一区别是,在第一种情况下,DRAWABLE2仅在聚焦时才会显示(无论是否按下),但在您的情况下它也必须未按下,这是唯一不同的条件。