8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「Android 4.4だとちゃんと文字選択できるのに、4.2だとできない」というときはClickableSpanを疑う

Last updated at Posted at 2015-09-08

大した話ではありません。

http://stackoverflow.com/questions/23363484/how-can-i-have-edittext-with-clickable-spannables-and-still-selectable-by-longcl
Stack Overflowでもちょいちょい話は上がっているみたいですが、
TextViewで リンクを含むテキスト を作ると、Selectableじゃなくなってしまう(※古い端末だけ) という問題についてのお話です。

原因

LinkMovementMethod.java
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には取り込まれていない。

回避策

LinkMovementMethodCompat

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());
としてやる。

結果

Screenshot_2015-09-08-12-46-49.png

キタ━━━━(゚∀゚)━━━━!! となります。

あとがき

おそらく、ArrowKeyMovementMethod はJellyBean以前でもテキスト選択できるからという理由で、ArrowKeyMovementMethodをベースにしているソースも見受けられますが、原因と対策がかみあっていないです。
原因に対して素直に対策をするのが最善かなと思って、シンプルな回避策を載せてみました。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?