繁体   English   中英

textview 上的 Onclick 事件(具有 TextIsSelectable="true")仅在第二次单击时调用

[英]Onclick event on textview(that has TextIsSelectable="true") is ony called on second click

我在onClickListener上有一个textview ,而 textview 有一个selectable标志。 但是我指定的onclick事件只有在第二次点击textview时才会调用。 在第二次调用 onclick 之后,如果另一个textviewselectable通过onclicklistener选择它也只被调用第二次,那么它工作正常,但另一个只能再次工作。 我找不到这些奇怪事件的来源。

telefoonTXT.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {startTelIntent();}}
);

urlTXT.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {startWebIntent();}
});

我也遇到了这个问题。 每当首先触摸文本视图时onTouch ,然后OnSelection和最后OnClick被调用。 如果我清楚地了解您的问题,您希望在用户double tapslong presses选择文本视图中的文本,就像通常的文本选择一样,但是当用户只需单击它时,您就希望onClick起作用。 我认为以下内容可能对您有所帮助。

添加一个gestureDetector到你的文本视图。

GestureDetectorCompat mDetector;
mDetector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener());

mDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        // This is where u add your OnClick event
        startTelIntent();
        return false;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.d("dtttt", "double tap");
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return false;
    }
});

telefoonTXT.setOnTouchListener(new View.OnTouchListener() {
     @Override
     public boolean onTouch(View v, MotionEvent event) {
          mDetector.onTouchEvent(event);
          return false;
     }
});

我刚刚在 TextView Xml 中使用:

android: TextIsSelectable="true" 
android: clickable="true"

对我来说工作得很好。 第一个 Single Tap 称为 onclick 事件,而 Anytime LongClick 选择文本。 并且双击一次调用这两个方法。 但是,在我的情况下,这没问题,这对我有用,可以在不使用一堆代码的情况下调用 onclick 并一次选择文本。
一件额外的事情,它在适配器和回收器视图中也能正常工作。

在我的情况下,焦点更改侦听器有效,但请注意在 androidTv 中使用它时使用方向键移动的情况

textView.setOnFocusChangeListener { v, hasFocus ->
    if (hasFocus && textView.measuredHeight > textView.lineHeight * textView.lineCount) {
    //your click event               
    }
}

我检查文本是否可以滚动然后不要点击事件

接受的答案很好。 但是我还有一个额外的问题:当我在 textview 中有一些选择文本时,我想点击 textview 以仅取消选择文本 - 而不执行点击侦听器。 并且仅在没有文本选择的情况下单击执行。 所以下面是我的解决方案:

@SuppressLint("ClickableViewAccessibility")
public static void setOnClickGestureDetectorListener(TextView textView, Context context, View.OnClickListener onClickListener){
    if (textView == null || context == null || onClickListener == null)){
        return;
    }
    final GestureDetectorCompat detector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener());
    detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            onClickListener.onClick(textView);
            return false;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            return false;
        }
    });
    textView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if ( v instanceof TextView ) {
                TextView textView = (TextView)v;
                if (textView.getSelectionStart() >= 0 && textView.getSelectionEnd() > textView.getSelectionStart()){
                    return false;
                }
                detector.onTouchEvent(event);
            }
            return false;
        }
    });
}

调用示例如下:

setOnClickGestureDetectorListener(textView, getContext(), new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //  This is where u add your OnClick event     
                    }
                });

设置这个...

TextisSelectable = "false"

我认为它会正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM