大した話ではありません。
http://stackoverflow.com/questions/23363484/how-can-i-have-edittext-with-clickable-spannables-and-still-selectable-by-longcl
Stack Overflowでもちょいちょい話は上がっているみたいですが、
TextViewで リンクを含むテキスト を作ると、Selectableじゃなくなってしまう(※古い端末だけ) という問題についてのお話です。
原因
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index aff233d..3855ff3 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -36,6 +36,11 @@
private static final int DOWN = 3;
@Override
+ public boolean canSelectArbitrarily() {
+ return true;
+ }
+
+ @Override
protected boolean handleMovementKey(TextView widget, Spannable buffer, int keyCode,
int movementMetaState, KeyEvent event) {
switch (keyCode) {
こいつがJB以前のAndroidには取り込まれていない。
回避策
class LinkMovementMethodCompat extends LinkMovementMethod {
@Override
public boolean canSelectArbitrarily() {
return true;
}
public static MovementMethod getInstance() {
if (sInstance == null)
sInstance = new LinkMovementMethodCompat();
return sInstance;
}
private static LinkMovementMethodCompat sInstance;
}
こんな感じのクラスを用意して
linktext.setMovementMethod(LinkMovementMethod.getInstance());
と呼ぶ代わりに
linktext.setMovementMethod(LinkMovementMethodCompat.getInstance());
としてやる。
結果
キタ━━━━(゚∀゚)━━━━!! となります。
あとがき
おそらく、ArrowKeyMovementMethod はJellyBean以前でもテキスト選択できるからという理由で、ArrowKeyMovementMethodをベースにしているソースも見受けられますが、原因と対策がかみあっていないです。
原因に対して素直に対策をするのが最善かなと思って、シンプルな回避策を載せてみました。