2017-09-03 72 views
0

是否有创建自定义链接和处理他们的“触摸”的行为为Android的TextView组件的简单方法?的TextView与自定义链接

我没有在互联网上找到任何解决方案,但随我自己。

+0

请问[linkify](https://stackoverflow.com/questions/4746293/android-linkify-textview)能解决你的问题吗? – isabsent

+0

在Linkify的情况下,你必须实现自己的架构和你仍然需要重写Linkmovement方法或者为了编写自己的反应触摸事件。下面的方法使用该框架的HTML包装,这是相当方便的,我想。 – Kvant

回答

0

有一种简单的方法可以为textview创建自定义链接,并通过触摸事件处理其行为。 为了避免撰写和编写自己的模式的包装,使用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); 

     } 
    });