17

我有一个onClickListeneron atextview并且 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();}
});
4

4 回答 4

20

我也遇到过这个问题。每当首先触摸文本视图时onTouch,都会调用文本视图。如果我清楚地理解您的问题,您想在用户或喜欢通常的文本选择时在文本视图中选择文本,但当用户只需单击它时,您想要运行。我认为以下内容可能会对您有所帮助。OnSelectionOnClickdouble tapslong pressesonClick

将 a 添加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;
     }
});
于 2016-02-05T10:33:07.307 回答
-1

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

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

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

于 2021-06-14T16:27:34.297 回答
-1

接受的答案很好。但是我还有一个额外的问题:当我在 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     
                    }
                });
于 2022-01-08T06:56:31.697 回答
-3

设置这个...

TextisSelectable = "false"

我认为它会正常工作

于 2013-10-25T08:28:03.643 回答