使用默认图纸按住按钮

时间:2013-10-14 14:29:23

标签: android button

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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>

使用radiobox和相应的ControlGroup与theese样式也可能更加实用,这样您就可以以编程方式轻松访问状态

答案 2 :(得分:1)

使用setPressed(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() - 返回一个布尔值来指示你的监听器   消耗这个事件。重要的是这个事件可以有   相互跟随的多个动作。所以,如果你在什么时候返回false   收到了下行动作事件,表示你没有   消耗了这个事件,对后续行动也不感兴趣   从这个事件。因此,您不会被要求进行任何其他操作   在事件中,例如手指手势或最终的向上动作   事件