Search code examples
javaandroidandroid-intenttextviewonclicklistener

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


I have a onClickListener on a textview and the textview has the flag that it's selectable. But the onclick event I specified is only called when the textview is clicked a second time. After the second time it calles the onclick right, but if a other textview that also is selectable with a onclicklistener it also is only called the second time, then it works fine, but then the other one works only the second time again. I can't find the source of these weird events.

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

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

Solution

  • I faced this issue as well. Whenever text view is touched firstly onTouch, then OnSelection and at last OnClick is called. If i understand your problem clearly you want to select text in text view when user double taps or long presses like the usual text selection but when user simply clicks it once u want the onClick to function. I think the following might help you.

    Add a gestureDetector to your text View.

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