[英]Onclick event on textview(that has TextIsSelectable="true") is ony called on second click
我在onClickListener
上有一個textview
,而 textview 有一個selectable
標志。 但是我指定的onclick
事件只有在第二次點擊textview
時才會調用。 在第二次調用 onclick 之后,如果另一個textview
也selectable
通過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 taps
或long 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.