【问题标题】:Keep button pressed with default drawings使用默认图纸按住按钮
【发布时间】:2013-10-22 03:46:16
【问题描述】:

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

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

【问题讨论】:

标签: android button


【解决方案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 时 收到down动作事件,表示没有 消费了该事件并且对后续操作也不感兴趣 从这个事件。因此,您不会被要求执行任何其他操作 在事件中,例如手指手势或最终的向上动作 事件。

【讨论】:

    【解决方案2】:

    在您的 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 可能更实用,这样您就可以轻松地以编程方式访问状态

    【讨论】:

    • 我收到错误:找不到与给定名称匹配的资源(在“drawable”处,值为“@drawable/btn_default_normal”)。
    • 您必须使用 android 命名空间来获取默认资源,例如:@android:drawable/btn_default_normal
    【解决方案3】:

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

    【讨论】:

    • setPressed 对正在单击的按钮不起作用。如果我将其设置为不同的按钮,那么它会正确设置按下状态,但在“呼叫者”按钮上它只会闪烁并且不会保持按下状态
    猜你喜欢
    • 2016-05-26
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多