0

我有按钮矩阵。在按钮按下动作后,我想保持这种状态,在按下另一个按钮后,我想“解压”第一个按钮并保持按下新的按钮。

我知道我可以使用选择器和 state_pressed 来实现这一点,但我想避免定义自己的图纸。有没有办法为(未)按下的按钮重用默认的 Android 绘图?他们叫什么名字?

4

3 回答 3

1

在您的 SDK 中,您可以找到所有 Android 标准样式/绘图。这是您要查找的文件:sdk\platforms\android-17\data\res\drawable\btn_default.xml内容:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_default_normal" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="@drawable/btn_default_normal_disable" android:state_enabled="false" android:state_window_focused="false"/>
    <item android:drawable="@drawable/btn_default_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/btn_default_selected" android:state_enabled="true" android:state_focused="true"/>
    <item android:drawable="@drawable/btn_default_normal" android:state_enabled="true"/>      
    <item android:drawable="@drawable/btn_default_normal_disable_focused" android:state_focused="true"/>
    <item android:drawable="@drawable/btn_default_normal_disable"/>
</selector>

此外,使用带有这些样式的单选框和相应的 ControlGroup 可能更实用,这样您就可以轻松地以编程方式访问状态

于 2013-10-14T14:50:09.703 回答
1

usingsetPressed(true)不会将正在单击的按钮保持在按下状态是正确的,因为单击后按钮返回到setPressed(false)

您可以覆盖onTouch并实现自己的行为,如下所示:

button.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    //this is touch
                    v.setPressed(true);
                }
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    //this is click. Do everything triggered by a click here
                    deselectAllButtons();
                    v.setPressed(true);
                }
                return true;
            }
        });

deselectAllButtons()我将所有按钮的按下状态设置为false.

请注意,这里的关键思想是不应调用 onClick。这就是 onTouch 应该返回 true 的原因,这意味着触摸事件已被消耗:

onTouch() - 这将返回一个布尔值来指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在接收到 down 操作事件时返回 false,则表明您尚未消费该事件,并且对该事件的后续操作也不感兴趣。因此,事件中的任何其他操作都不会调用您,例如手指手势或最终的向上操作事件。

于 2014-05-30T10:16:47.790 回答
1

尝试在此视图上使用setPressed(true)

于 2013-10-14T14:41:35.587 回答