TextView(TextIsSelectable =“true”)上的Onclick事件仅在第二次单击时调用

20

我在一个textview上设置了一个onClickListener,并且该textview具有可选择的标志(selectable)。 但是我指定的onclick事件只有在第二次点击textview时才会被调用。第二次后,它就可以正确地调用onclick了,但是如果另一个textview也是selectable且带有onclicklistener,则它也只有在第二次点击时才会被调用,然后它也能正常工作,但是接下来的另一个textview又需要第二次点击才能正常工作。我找不到这些奇怪事件的来源。

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

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

尝试在TextView上使用onTouchListener。@Wesley Egbertsen - GrIsHu
ķÖżõ║åĶ«ŠńĮ«TextIsSelectable="true"õ╣ŗÕż¢’╝īĶ┐śĶ”üõĖ║µé©ńÜäTextViewĶ«ŠńĮ«android:clickable="true"ŃĆé - GrIsHu
如果我将它们设置为onTouchListener,你就不能再选择文本了,因为我认为onTouch会优先执行。 - Wesley Egbertsen
你找到解决方案了吗? - henry74918
我仍然没有找到解决方案。 - Wesley Egbertsen
4个回答

21
我也遇到了这个问题。每当触摸文本视图时,首先会调用onTouch,然后是OnSelection,最后是OnClick。 如果我清楚地理解了您的问题,您希望在用户双击或长按时选择文本视图中的文本,就像通常的文本选定一样,但当用户只单击它一次时,您希望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;
     }
});

Frosty的建议是正确的方向。我可以确认它对我有效。 - Qylin
应该将其标记为答案。运行良好。 - BArtWell
在onSingleTapConfirmed()中真正调用您打算执行的操作非常重要,而不是调用performClick(),这会导致用户第二次选择时出现问题。 - mattlaabs
真让我惊讶的是 textIsSelectable 如此不稳定。你的解决方案很好,点赞。 - Minas Mina
@mattlaabs,你能详细说明从onSingleTapConfirmed()调用performClick()的问题吗?我尝试过了,但一切似乎都正常工作。 - Tushar Kathuria

-1
在我的情况下,焦点变化监听器是有效的,但要注意在使用D-pad移动时,在androidTv上使用它的情况。
textView.setOnFocusChangeListener { v, hasFocus ->
    if (hasFocus && textView.measuredHeight > textView.lineHeight * textView.lineCount) {
    //your click event               
    }
}

我检查文本是否可以滚动,如果可以则不接受点击事件


-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     
                    }
                });

-3

设置这个...

TextisSelectable = "false"

我认为它会正确地工作


3
它会正常工作,但我也希望文本是可选择的。 - Wesley Egbertsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接