[英]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.