首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓上的“按住”按钮需要使用onTouchListener更改状态(自定义XML选择器)。

安卓上的“按住”按钮需要使用onTouchListener更改状态(自定义XML选择器)。
EN

Stack Overflow用户
提问于 2012-09-26 03:57:30
回答 4查看 27.7K关注 0票数 21

我有一个需要“按住”功能的按钮图形,所以我使用的不是onClickListener,而是onTouchListener,这样应用程序就可以对

代码语言:javascript
复制
 MotionEvent.ACTION_DOWN,

代码语言:javascript
复制
 MotionEvent.ACTION_UP

根据这两个事件被触发的速度,我可以在这两个事件之间运行一个"pressAndHoldHandler“。

总之,长话短说:我在同一个应用程序中有许多“基本”按钮,它们不需要按住功能,所以它们使用的是onClickListener。

这些按钮中的每一个都使用自己的XML选择器文件进行了图形化定制:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_chicken_off" />

    <item
        android:state_enabled="true"
        android:state_pressed="true"
        android:drawable="@drawable/btn_chicken_s3" />

    <item
        android:state_enabled="true"
        android:state_focused="true"
        android:drawable="@drawable/btn_chicken_s2" />

    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_chicken_off" />

</selector>

所以,这里的问题是:上面的选择器不能通过onTouchListener访问。只有onClickListener才会使用它自己方法的onClick()部分引入状态更改,因此这些“按住”按钮永远不会更改状态。对用户的反馈非常糟糕。

我目前通过执行以下操作,在ACTION_DOWN和ACTION_UP的切换用例中强制执行上述操作:

代码语言:javascript
复制
if (action == MotionEvent.ACTION_DOWN) {
    btn_chicken.setBackgroundResource(R.drawable.btn_chicken_s3);
}
else
    if (action == MotionEvent.ACTION_UP) {
        btn_chicken.setBackgroundResource(R.drawable.btn_chicken_off);
    }

但它看起来像是一个黑客,它错过了“专注而不是压力”的阶段。

以前有没有人偶然发现过这个?

EN

回答 4

Stack Overflow用户

发布于 2013-01-09 15:45:28

确保在onTouchListener()函数的末尾返回false。:)

票数 4
EN

Stack Overflow用户

发布于 2012-09-26 06:32:12

您可以只设置按钮onClickListener,并将其onClick方法保留为空。您的逻辑在onTouch中实现。这样你就会有新闻效果了。

附注:你不需要在选择器中包含所有这些状态,你可以简单地使用:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

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

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

</selector>
票数 3
EN

Stack Overflow用户

发布于 2012-11-20 02:49:39

我想通了!只需使用view.setSelected(),如下所示:

代码语言:javascript
复制
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        yourView.setSelected(true);
        ...
        return true;
    }
    else if(event.getAction() == MotionEvent.ACTION_UP){
        yourView.setSelected(false);
        ...
        return true;
    }
    else 
        return false;
}

这将使您的选择器工作,即使您的视图有一个onTouch侦听器:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12590169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档