Issue id: ClickableViewAccessibility

在Activity中只写一个TextView,只设置

textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
                Log.d(TAG,"event:"+event.getAction());
                return false;
            }
        });

点击按钮,发现只打印evet:0
这个是ACTION_DOWN事件,可以理解为return false没有对事件做处理。

然后修改为return true

textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
                Log.d(TAG,"event:"+event.getAction());
                return false;
            }
        });

点击按钮打印:event:0(ACTION_DOWN)-->2(ACTION_MOVE)-->1(ACTION_UP)
理解为对事件做处理。

你会发现上面两种写法,都是会出现代码块变黄。警告

大概意思是如果你对textView设置了onTouch事件,那它的onClick事件就受到影响了(如果你没有设置onClick则不影响可以不管),不论怎样我们还是最好去解决。大概意思是用performClick来解决。

假如你同时对textView设置了onTouch和onClick看有哪些影响

        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG,"click");
            }
        });
        textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
                Log.d(TAG,"event:"+event.getAction());
                return false;
            }
        });

点击后打印:0->2->1->click
分析,加了click后竟然打印出了2和1两个事件。说明添加click后onTouch虽然return false 但是打印了完整事件流程。

把return false改为true,点击后打印:
0->2->1
分析,竟然没有click事件。

经过上面分析:果然click和onTouch是相互影响的。那performClick就是两者之间的桥梁。修正他们两者正向影响(用户需求变更)。

在方法外忽略警告:

    @SuppressLint("ClickableViewAccessibility")
    private void initListener() {
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "click");
            }
        });
        textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
                Log.d(TAG, "event:" + event.getAction());
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        break;
                    case MotionEvent.ACTION_UP:
                        textView.performClick();
                        break;
                }
                return true;
            }
        });
    }

在onTouch return true;的时候在up事件中添加:textView.performClick();
点击打印:0->2->1->click

在onTouch return false;的时候在up事件中添加:textView.performClick();
0->2->1->click->click。

总结:则这个performClick是为了onTouch返回true的时候想调用onClick事件做优化的。

你可能感兴趣的:(Issue id: ClickableViewAccessibility)