問題是,如果我Linkify textView underliyng ScrollView不聽我設置的掃描手勢。是否有一種方法可以有Linkify而不會搞亂underliyng視圖的手勢? 我試圖覆蓋ontouchEvent並將錯誤返回到ACTION_MOVE,但滾動視圖的手勢需要ACTION_DOWN和ACTION_UP事件才能發揮作用。有沒有辦法實現這一點?Android TextView Linkify攔截與父視圖手勢
回答
Linkify
適用於運動方式爲textView LinkMovementMethod
。該移動方法認爲它實現了一種垂直滾動方法,它覆蓋了父級擁有的任何其他滾動方法。儘管touchEvent
可以與父代分離,但是特定父代ScrollView
需要整個序列ACTION_DOWN
,ACTION_MOVE
,ACTION_UP
執行(掃描檢測)。
因此,我的問題的解決方案是在Linkify刪除textView的滾動方法並處理textView的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(...)方法的小壞事,
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 item, 但它有時會獲得鏈接!
您需要設置該標誌在需要的價值 然後再打一個的setText(...)
這裏有點不清楚你在說什麼。這是問題的答案還是你想問一個新的問題? – SuperBiasedMan
這主要是一個筆記,因爲我發現這個話題時,搜索「鏈接在ListView中的textview」問題 – Mike
- 1. OS X - 攔截手勢
- 2. Linkify in android TextView
- 3. Linkify與TextView
- 4. 如何攔截垂直滑動手勢
- 5. 父視圖不趕滾動手勢
- 6. Android的自定義TextView不攔截父母的OnClickListener
- 7. 父視圖上的雙擊手勢和子視圖上的單擊手勢
- 8. ACTION_CALL意圖,與Linkify?
- 9. Linkify的TextView
- 10. ListView的父視圖無法攔截觸摸事件
- 11. Android:攔截Youtube意圖?
- 12. 在Android中攔截意圖
- 13. Android中的textview上的手勢
- 14. 手勢在列表視圖android
- 15. 在Android Web視圖中捏手勢
- 16. Android onClick攔截onFling
- 17. 圖像視圖上的DoubleTap手勢
- 18. 與Linkify Android開放活動
- 19. android上的攔截攔截器
- 20. 待辦事項的UIEvent和UIEventTypeMotion攔截只搖晃手勢?
- 21. UINavigationBar的:攔截後退按鈕和向後滑動手勢
- 22. 快速攔截(或強制停止)長按手勢識別器
- 23. 更新父親攔截
- 24. Linkify適用於Android中的TextView嗎?
- 25. Android TextView啓用LinkiFy和Href標籤
- 26. 手機firefox點擊攔截
- 27. 在android web視圖中攔截html5視頻播放事件
- 28. 用手勢滑動視圖
- 29. 與Android的邊框手勢
- 30. ios輕掃手勢不能在子視圖上用父視圖上的手勢識別
百萬感謝你要跟這個答案。 –
我很高興它終於幫助別人:D – weakwire
偉大的答案隊友! – Maurycy