Мне нужен интерактивный диапазон, чтобы в моем приложении были как обычные, так и длинные методы щелчка, и я узнал здесь (В Android - как я могу регистрировать только длинные клики с помощью ClickableSpan), что я мог бы расширить класс LinkMovementMethod и класс ClickableSpan, чтобы разрешить делать что, но в настоящее время работают и длинные, и короткие щелчки, но для длинного щелчка вместо запуска действия длинного щелчка, когда элемент был нажат достаточно долго, он будет ждать, пока вы не отпустите элемент, чтобы выстрелить. Вот мой код для расширенных классов:
LinkMovementClass
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.view.MotionEvent;
import android.widget.TextView;
public class LongClickLinkMovementMethod extends LinkMovementMethod {
private Long lastClickTime = 0l;
private int lastX = 0;
private int lastY = 0;
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
lastX = x;
lastY = y;
int deltaX = Math.abs(x-lastX);
int deltaY = Math.abs(y-lastY);
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
LongClickableSpan[] link = buffer.getSpans(off, off, LongClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - lastClickTime < 1000)
link[0].onClick(widget);
else if (deltaX < 10 && deltaY < 10)
link[0].onLongClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
lastClickTime = System.currentTimeMillis();
}
return true;
}
}
return super.onTouchEvent(widget, buffer, event);
}
public static MovementMethod getInstance() {
if (sInstance == null)
sInstance = new LongClickLinkMovementMethod();
return sInstance;
}
private static LongClickLinkMovementMethod sInstance;
}
Класс LongClickableSpan
import android.text.style.ClickableSpan;
import android.view.View;
public abstract class LongClickableSpan extends ClickableSpan {
abstract public void onLongClick(View view);
}
Фактическая реализация
LongClickableSpan eruptionText = new LongClickableSpan() {
@Override
public void onClick(View tvEruptions) {
LinkFunctions.link_eruption_detail(getApplicationContext(),PostErupionID);
}
@Override
public void onLongClick(View tvEruptions) {
if(SignedInUserID != 0) {
DialogFragment newFragment = new Dialogs.QuickActionsDialogFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putLong("eruptionID", PostErupionID);
newFragment.setArguments(args);
newFragment.show(getFragmentManager(), "QuickActions");
}
}
};
ss.setSpan(eruptionText, startpos[(int) j], endpos[(int) j], Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);