Problem polega na tym, że jeśli i Linkify tekstView underliyng ScrollView nie słuchaj gestów Sweep ustawiłem. Czy jest jakiś sposób na skorzystanie z Linuksfy bez zakłócania gestów podmenu? Próbowałem przesłonić ontouchEvent i zwrócić wartość false do ACTION_MOVE, ale gest przewijania musi działać w trybie ACTION_DOWN i ACTION_UP. Czy istnieje sposób, aby to osiągnąć?Android TextView Linkify przechwytuje z rodzica Zobacz gesty
Odpowiedz
Linkify
dotyczy metody moveMethod do textView LinkMovementMethod
. Ta metoda ruchu myślała, że implementuje przewijaną metodę pionowo, która zastępuje każdą inną metodę przewijania, którą ma rodzic. Chociaż touchEvent
może być przypisany do jednostki nadrzędnej, specyficzny rodzic ScrollView
potrzebuje całej sekwencji do wykonania (wykrywanie zamiatania).
Tak więc rozwiązaniem mojego problemu jest po Linkiłach, aby usunąć metodę przewijania textView i obsłużyć akcję wykrywania łącza w z textView.
@override
public boolean onTouchEvent(MotionEvent event) {
TextView widget = (TextView) this;
Object text = widget.getText();
if (text instanceof Spanned) {
Spannable buffer = (Spannable) text;
int action = event.getAction();
if (action == MotionEvent.ACTION_UP
|| action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
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);
ClickableSpan[] link = buffer.getSpans(off, off,
ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
}
}
}
return false;
}
ten sposób mam wykrywanie Link_Click (wykonywane tylko z użytkownikiem dotyka link i nie cała TextView) i nie mam całą LinkMovementMethod.
@weakwire i @Ridicully odpowiedzi są poprawne. Właśnie stworzyłem mały fragment, który możesz ponownie wykorzystać w swoim projekcie.
tym odnośnikiem: https://gist.github.com/amilcar-andrade/e4b76840da1dc92febfc
Jest mały złe, że metoda TextView :: setText (...) wykorzystując autoLink flagę,
if (mAutoLinkMask != 0) {
Spannable s2;
if (type == BufferType.EDITABLE || text instanceof Spannable) {
s2 = (Spannable) text;
} else {
s2 = mSpannableFactory.newSpannable(text);
}
if (Linkify.addLinks(s2, mAutoLinkMask)) {
text = s2;
type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;
/*
* We must go ahead and set the text before changing the
* movement method, because setMovementMethod() may call
* setText() again to try to upgrade the buffer type.
*/
mText = text;
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
Więc spędziłem czas, aby zrozumieć , dlaczego wyłączam linki w pozycji ListView item, , ale czasami uzyskuje się link!
Musisz ustawić tę flagę w potrzebnej wartości a następnie wezwać setText (...)
To trochę niejasne, co tu mówisz. Czy jest to odpowiedź na pytanie, czy próbujesz zadać nowe pytanie? – SuperBiasedMan
Jest to głównie uwaga, ponieważ znalazłem ten temat podczas wyszukiwania problemu "Linkify textview w ListView" – Mike
Milion podziękowań dla tej odpowiedzi. –
Cieszę się, że w końcu pomogło komuś: D – weakwire
świetna odpowiedź kolego! – Maurycy