【问题标题】:Android :: OnTouchListener && OnClickListener combination issueAndroid :: OnTouchListener && OnClickListener 组合问题
【发布时间】:2014-03-09 16:04:37
【问题描述】:

问题描述:

我在RelativeLayout 上有一个TextView,我想在用户触摸它时将它涂成红色,并在他点击它时转到另一个页面。 所以我尝试设置一个OnClickListener 来进行点击,并设置一个OnTouchListener 来实现触摸功能(MotionEvent.ACTION_DOWN)但是这种组合不起作用,因为OnTouchListener 使OnClickListener 不起作用(don不知道为什么)。

在论坛上人们说我们可以通过 OnTouch MotionEvent.ACTION_UP 实现 OnClick,但是这个可以从我的 TextView 布局中触发(如果你按下 TextView 并拖动手指就会被点击释放),这不是我想要的行为,因为我想要:
在 TextView 上单击 = 按下 + 释放。

有人可以给我一个解决方案吗?

【问题讨论】:

    标签: android release ontouchlistener pressed


    【解决方案1】:

    您可以在 action_up 时调用 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;
        }
        });
    

    【讨论】:

    • 我遇到了同样的问题...而且 v.performClick 工作得很好...这是解决方案...请接受答案
    • 谢谢斯文。这太棒了。
    • Hm.... 如果我的TouchListener 决定事件不是滑动,那么如果“TouchListener”位于按钮上方的视图上应该获得点击怎么办?关于如何将其传递给下面的任何视图的任何想法?
    【解决方案2】:

    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"
    

    希望对你有帮助!!!

    编辑:此外,在 DOWN 和 UP 中都应该有一个标志。将其设置为 DOWN 并检查其是否设置为 UP。这将避免用户可能点击屏幕中的任意位置然后将鼠标悬停在您的文本视图上并释放它的错误。

    【讨论】:

    • 非常感谢!你肯定帮了我。对我来说,诀窍是设置你所说的三个属性......
    • 感谢您的帮助!我的 TextView 中缺少 android:focusable="true"
    【解决方案3】:

    遇到了同样的问题。通过从 ACTION_MOVE 返回 false 来解决它。我已经与它斗争了几个小时,尝试了各种事情,但似乎我一直忽略了这个小问题......现在它是有道理的。当您从 onTouch 返回 true 时,将停止进一步的处理,因此 OnClickListener 不会意识到任何移动并触发 onClick,即使在指针移出视图后也是如此。

    【讨论】:

    • 代表@bugs99 因缺乏声誉而无法添加评论:通过将return true 更改为return false,您可以执行onTouchListener() 操作,然后通过触摸事件发送到onClickListener()。有了这个,就不需要显式地执行performClick()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2011-05-26
    相关资源
    最近更新 更多