簡體   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