2010-03-24 7 views
4

Je suis sur le développement d'un type d'application Twitter où je veux que l'utilisateur serait affiché les délais et le TextView dans les listes nécessitent d'effectuer des clics sur (http://)URLs, (@) noms d'utilisateur, et (#) hasTags et je veux invoquer des méthodes personnalisées sur ces actions, j'ai utilisé la classe Linkify et les actions, mais d'aucune utilité parce que la personnalisation que je demande ne peut être incorporéeAndroid Twitter Application Développement et utilisation de TextView et Linkify

+0

Pouvez-vous expliquer ce que vous voulez faire exactement? – Steve

+0

"Ceci est un #test d'expressions régulières avec des liens http://example.com tels qu'ils sont utilisés dans @twitter. Http://twitter.com." si c'est un texte dans le TextView alors j'ai besoin de #test, http://example.com, @twitter et http://twitter.com comme des chaînes séparées et Clickable de Textview et si vous cliquez dessus, je les exige pour être manipulé dans une coutume méthode pour donner mes actions sur ces chaînes –

+0

Cette action est-elle possible de quelque manière que ce soit –

Répondre

0

beaucoup addLinks() méthodes sur Linkify, dont l'un peut vous permettre d'atteindre vos objectifs, si votre objectif est de démarrer une activité à partir de ces liens.Vous pouvez également examiner le code source à Linkify pour voir comment vous pourriez créer le vôtre qui répond à vos besoins.

+0

Mais j'ai besoin d'obtenir un appel de méthode, ou une méthode d'interface pour le match Regex particulier comment est-ce possible en utilisant le Linkify –

+0

10 Je doute que ce soit possible. – CommonsWare

+0

Maintenant, c'est ce que ma demande exacte est. Cela peut-il être réalisé en utilisant d'autres moyens? S'il vous plaît n'importe quel pointeur dans cette direction m'aiderait vraiment beaucoup –

2

mentionné ci-dessous Voici ma solution. L'idée principale est de diviser les mots du texte et la création d'un TextView pour chacun, envelopper chaque ligne avec LinearLayout horizontale et les lignes en LinearLayout verticale:

private LinearLayout mDescription; // vertical LinearLayout 

    private void setDescriptionText(String twitterText){ 
    String[] splitted; 

    String regexp = "(@[-a-zA-Z0-9_]*)|(#[-a-zA-Z0-9_]*)|(http://[-a-zA-Z0-9/._]*)|(https://[-a-zA-Z0-9/._]*)|()"; 

    TextSplitter splitter = new TextSplitter(regexp); 
    splitted = splitter.split(twitterText); 

    TextView[] textViews = new TextView[splitted.length]; 
    for (int i = 0; i < splitted.length; i++) { 
     final String str = splitted[i]; 
     TextView textView = new TextView(mDescription.getContext()); 
     textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); 
     textViews[i] = textView; 


     textView.setText(str); 
     textView.setTypeface(roboReg); 
     textView.setTextColor(Color.WHITE); 

     if (str.startsWith("@")){ 
      textView.setTextColor(mLinkColor); 
      textView.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        startWebViewActivity("https://twitter.com/"+str.substring(1)); 
       } 
      }); 
     }else if (str.startsWith("#")){ 
      textView.setTextColor(mLinkColor); 
      textView.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        startWebViewActivity("https://twitter.com/#!/search/?q="+str.substring(1) + "&src=hash"); 
       } 
      }); 

     }else if (str.startsWith("http://") || str.startsWith("https://")){ 
      textView.setTextColor(mLinkColor); 
      textView.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        startWebViewActivity(str); 
       } 
      }); 
     } 
    } 

    int maxWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 210, getResources().getDisplayMetrics()); 
    populateText(mDescription, maxWidth , textViews, mDescription.getContext()); 

} 

private void populateText(LinearLayout ll,int maxWidth, View[] views, Context mContext) { 

    ll.removeAllViews(); 
    LinearLayout.LayoutParams params; 
    LinearLayout newLL = new LinearLayout(mContext); 
    newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.WRAP_CONTENT)); 
    newLL.setGravity(Gravity.LEFT); 
    newLL.setOrientation(LinearLayout.HORIZONTAL); 

    int widthSoFar = 0; 

    for (int i = 0; i < views.length; i++) { 
     LinearLayout LL = new LinearLayout(mContext); 
     LL.setOrientation(LinearLayout.HORIZONTAL); 
     LL.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); 
     LL.setLayoutParams(new ListView.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     views[i].measure(0, 0); 
     params = new LinearLayout.LayoutParams(views[i].getMeasuredWidth(), 
       LayoutParams.WRAP_CONTENT); 
     LL.addView(views[i], params); 
     LL.measure(0, 0); 
     widthSoFar += views[i].getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS 
     if (widthSoFar >= maxWidth) { 
      ll.addView(newLL); 

      newLL = new LinearLayout(mContext); 
      newLL.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT, 
        LayoutParams.WRAP_CONTENT)); 
      newLL.setOrientation(LinearLayout.HORIZONTAL); 
      newLL.setGravity(Gravity.LEFT); 
      params = new LinearLayout.LayoutParams(LL 
        .getMeasuredWidth(), LL.getMeasuredHeight()); 
      newLL.addView(LL, params); 
      widthSoFar = LL.getMeasuredWidth(); 
     } else { 
      newLL.addView(LL); 
     } 
    } 
    ll.addView(newLL); 
} 

private class TextSplitter { 

    private Pattern pattern; 
    private boolean keep_delimiters; 

    public TextSplitter(Pattern pattern, boolean keep_delimiters) { 
     this.pattern = pattern; 
     this.keep_delimiters = keep_delimiters; 
    } 

    public TextSplitter(String pattern, boolean keep_delimiters) { 
     this(Pattern.compile(pattern == null ? "" : pattern), keep_delimiters); 
    } 


    public TextSplitter(String pattern) { 
     this(pattern, true); 
    } 

    public String[] split(String text) { 
     if (text == null) { 
      text = ""; 
     } 

     int last_match = 0; 
     LinkedList<String> splitted = new LinkedList<String>(); 

     Matcher m = this.pattern.matcher(text); 

     while (m.find()) { 

      splitted.add(text.substring(last_match, m.start())); 

      if (this.keep_delimiters) { 
       splitted.add(m.group()); 
      } 

      last_match = m.end(); 
     } 

     splitted.add(text.substring(last_match)); 

     return splitted.toArray(new String[splitted.size()]); 
    } 

}