Android::OnTouchListener&&;onclick侦听器组合问题

Android::OnTouchListener&&;onclick侦听器组合问题,android,release,ontouchlistener,pressed,Android,Release,Ontouchlistener,Pressed,问题描述: 我在RelativeLayout上有一个TextView,当用户触摸它时,我想把它涂成红色,当用户点击它时,我想进入另一个页面。 因此,我尝试设置一个OnClickListener来执行单击,并设置一个OnClickListener来实现触摸功能(MotionEvent.ACTION\u DOWN),但这种组合不起作用,因为OnClickListener使OnClickListener不起作用(不知道为什么) 在论坛上,人们说我们可以通过OnTouchMotionEvent.ACTI

问题描述:

我在
RelativeLayout
上有一个
TextView
,当用户触摸它时,我想把它涂成红色,当用户点击它时,我想进入另一个页面。 因此,我尝试设置一个
OnClickListener
来执行单击,并设置一个
OnClickListener
来实现触摸功能(
MotionEvent.ACTION\u DOWN
),但这种组合不起作用,因为
OnClickListener
使
OnClickListener
不起作用(不知道为什么)

在论坛上,人们说我们可以通过OnTouch
MotionEvent.ACTION\u UP
来实现
OnClick
,但是这一个可以从我的
TextView
布局中触发(如果你按下TextView并将手指从他身上拖出来释放它,它就会被点击),这不是我想要的行为,因为我想要:
单击文本视图上的=按下+释放


有人能给我一个解决办法吗?

Adel,是第一次点击有问题,还是根本没有点击

如果您有多个可单击布局,则第一次没有任何单击事件,则会出现此问题。这是因为它首先使其处于选中状态,然后您将获得单击事件,请尝试下面的代码

private class CustomTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        TextView tv = (TextView) v.findViewById(R.id.single_line_text);
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            tv.setTextColor(COLOR_WHEN_PRESSED);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            tv.setTextColor(COLOR_WHEN_RELEASED);
            // Action of click goes here
        } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
            tv.setTextColor(COLOR_WHEN_RELEASED);
                            // To handle release outside the layout region
        }
        return false;
    }
}
如果您为布局设置了触摸侦听器,那么这在我当前的实现中是有效的

您还需要在布局上设置以下内容

android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
希望对你有帮助


编辑:此外,向下和向上都应该有一个标志。将其设置为向下,并检查其是否设置为向上。这将避免出现这样的错误:用户可能点击屏幕上的任何位置,然后将鼠标悬停在textview上并将其释放。

当操作启动时,您可以调用View.performClick()。希望能有帮助

your_txtView.setOnClickListener(new TextView.OnClickListener(){
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    });

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){
            @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (MotionEvent.ACTION_DOWN == event.getAction()) {

        } else if (MotionEvent.ACTION_UP == event.getAction()) {
            v.performClick();
        }

        return true;
    }
    });

我也有同样的问题。通过从ACTION\u MOVE返回false解决了此问题。我已经和它斗争了几个小时,尝试了各种各样的事情,但似乎我一直忽视了这个小问题。。。现在它有了意义。当您从onTouch返回true时,进一步的处理将停止,因此OnClickListener不会意识到任何移动,甚至在指针移动到视图之外之后也会触发onClick。

我也遇到同样的问题…v.performClick工作得很好…这是解决方案…请接受回答谢谢sven。这太棒了。嗯。。。。如果“TouchListener”位于按钮上方的视图上,如果my
TouchListener
确定该事件不是刷卡,则该按钮应获得点击,该怎么办?关于如何将其传递给下面的任何视图,有什么想法吗?非常感谢!你肯定帮了我。我的诀窍是设置你所说的三个属性…谢谢你的帮助!我代表@bugs99在我的文本视图中丢失了android:focusable=“true”,因为@bugs99缺乏声誉而无法添加评论:通过将
返回true
更改为
返回false
,您可以执行
onTouchListener()
操作,然后将触摸事件传递给
onClickListener()
。这样,就不需要显式执行
performClick()