2017-09-03 8 views
0

カスタムリンクを作成し、Android TextViewコンポーネントの「オンタッチ」動作を処理する簡単な方法はありますか?カスタムリンク付きテキストビュー

私はインターネット上で解決策を見つけることはできませんでしたが、自分自身で解決しました。

+0

[linkify](https://stackoverflow.com/questions/4746293/android-linkify-textview)は問題を解決しますか? – isabsent

+0

Linkifyの場合、独自のスキーマを実装する必要がありますが、Touchmovementメソッドをオーバーライドしたり、タッチイベントに反応するために独自のメソッドを作成する必要があります。以下のメソッドは、フレームワークのHtmlラッパーを使用しています。これは非常に便利です。 – Kvant

答えて

0

テキストビューのカスタムリンクを作成し、タッチイベントの結果としてその動作を処理する簡単な方法があります。 独自のパターンラッパーの作成と書き込みを避けるために、Htmlラッパーが使用されています。

TextView tView = ((TextView)v.findViewById(R.id.otp_activation_notification)); 
    Spanned ssBuilder = Html.fromHtml("Not a link <a href=\"foo://haha/arg1/arg2?q1=1&q2=2\">The first link</a> bla bla " 
    + " <a href=\"foo://haha2?q3=3\">The second link</a>"); 
    tView.setText(ssBuilder); 
    tView.setMovementMethod(new LinkMovementMethod(){ 

     @Override 
     public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 
      //TODO: In order to override the links actions 
      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      Layout layout = widget.getLayout(); 
      int line = layout.getLineForVertical(y); 
      int off = layout.getOffsetForHorizontal(line, x); 

      try { 
       URLSpan[] urlSpans = buffer.getSpans(off, off, URLSpan.class); 
       if (urlSpans != null && urlSpans.length > 0) { 
        Uri uri = Uri.parse(urlSpans[0].getURL()); 
        String scheme = uri.getScheme(); 
        if ("foo".equals(scheme)) { 
         String command = uri.getAuthority(); 
         if ("haha".equals(command)) { 
          List<String> arguments = uri.getPathSegments(); 
          String q1 = uri.getQueryParameter("q1"); 
          String q2 = uri.getQueryParameter("q2"); 
          //TODO: Execute command (pay attention for MotionEvent) 
          return true; 
         } else if ("haha2".equals(command)) { 
          String q3 = uri.getQueryParameter("q2"); 
          //TODO: Execute command2 (pay attention for MotionEvent) 
          return true; 
         } 
         return false; 
        } 
       } 
      } catch (Exception e) { 
       //Log: unable to parse link; 
      } 
      //return false in case you don't want to use default behavior. 
      return super.onTouchEvent(widget, buffer, event); 

     } 
    }); 
関連する問題