समस्या यह है कि यदि मैं टेक्स्ट को लिंक करता हूं, तो स्क्रॉलव्यू देखें, मैंने देखा है कि स्वीप जेस्चर को सेट नहीं किया गया है। क्या लिंकली को अंडरलींग व्यू के इशारे से गड़बड़ किए बिना कोई तरीका है? मैंने ontouchEvent को ओवरराइड करने और ACTION_MOVE पर झूठी वापसी करने की कोशिश की लेकिन स्क्रॉलव्यू के इशारे को कार्य करने के लिए ACTION_DOWN और ACTION_UP ईवेंट की आवश्यकता है। क्या इसे हासिल करने का कोई तरीका है?एंड्रॉइड टेक्स्टव्यू लिंकिफाइड माता-पिता के साथ इंटरसेप्ट्स देखें जेस्चर देखें
उत्तर
Linkify
टेक्स्टव्यू LinkMovementMethod
पर एक आंदोलन विधि पर लागू होता है। उस आंदोलन विधि ने सोचा कि यह एक स्क्रॉलिंग लंबवत विधि को लागू करता है जो माता-पिता के किसी अन्य स्क्रॉलिंग विधि को ओवरराइड करता है। यद्यपि touchEvent
माता-पिता को भेजा जा सकता है, विशिष्ट पैरेंट ScrollView
को पूरा अनुक्रम ACTION_DOWN
, ACTION_MOVE
, ACTION_UP
निष्पादित करने के लिए (स्वीप डिटेक्शन) की आवश्यकता होती है।
तो टेक्स्टव्यू की स्क्रॉलिंग विधि को हटाने के लिए लिंकिफ़ाई के बाद मेरी समस्या का समाधान टेक्स्ट दृश्य के onTouchEvent
में LinkMovementMethod
लिंक पहचान कार्रवाई को संभालने के लिए है।
@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;
}
इस तरह मैं Link_Click का पता लगाने के लिए है (केवल उपयोगकर्ता के साथ प्रदर्शन लिंक और न कि पूरी TextView स्पर्श करता है) और मैं पूरे LinkMovementMethod जरूरत नहीं है।
@weakwire और @Ridicully उत्तर सही हैं। मैंने अभी एक छोटी सी चीज बनाई है जिसे आप अपने प्रोजेक्ट में फिर से उपयोग कर सकते हैं। , https://gist.github.com/amilcar-andrade/e4b76840da1dc92febfc
एक छोटी सी बुरी बात है कि TextView :: setText (...) विधि autoLink ध्वज का उपयोग नहीं है
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());
}
}
}
तो मैं एक समय बिताया को समझने के लिए:
यह लिंक है , मैं में लिंक्स को अक्षम क्यों कर रहा हूं ListView आइटम, लेकिन यह कभी-कभी एक लिंक प्राप्त करता है!
आप की जरूरत मूल्य में है कि ध्वज सेट और फिर एक setText (...)
यह थोड़ा अस्पष्ट है कि आप यहां क्या कह रहे हैं। क्या यह प्रश्न का उत्तर है या आप एक नया सवाल पूछने की कोशिश कर रहे हैं? – SuperBiasedMan
यह ज्यादातर नोट है, क्योंकि जब "ListView में टेक्स्टव्यू को लिंक करें" समस्या की खोज करते हैं तो मुझे यह विषय मिला – Mike
एक लाख इस उत्तर के लिए yous धन्यवाद कॉल करने के लिए की जरूरत है। –
मुझे खुशी है कि आखिरकार किसी की मदद की: डी – weakwire
महान उत्तर दोस्त! – Maurycy