2017-09-03 12 views
0

Existe-t-il un moyen simple de créer des liens personnalisés et de gérer leur comportement «au toucher» pour le composant Android TextView? Je n'ai trouvé aucune solution sur Internet, mais est venu avec le mien.TextView avec des liens personnalisés

+0

Est-ce que [linkify] (https://stackoverflow.com/questions/4746293/android-linkify-textview) résout votre problème? – isabsent

+0

Dans le cas de Linkify, vous devez implémenter votre propre schéma et vous devrez toujours surcharger la méthode Linkmovement ou écrire les vôtres pour réagir aux événements tactiles. La méthode ci-dessous utilise le wrapper Html du framework, ce qui est plutôt pratique, je pense. – Kvant

Répondre

0

Il existe un moyen simple de créer des liens personnalisés pour la visualisation de texte et de gérer leur comportement à la suite d'un événement tactile. Afin d'éviter de composer et d'écrire votre propre encapsuleur, l'encapsuleur HTML est utilisé.

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); 

     } 
    });