2012-04-02 11 views
24

テキストが動的に変更されたTextViewがあります。このテキストには、<a href='myWord'>myWord</a>のような文字列が含まれています。私はこの「リンク」をクリックした後、同じアクティビティでEditTextにmyWordを表示します。androidのTextViewの中のクリック可能な単語

これは私のコードです:

txt.setText(Html.fromHtml("...<a href='link'>link</a>...")); 
txt.setMovementMethod(LinkMovementMethod.getInstance()); 

それはhref属性内のURLのために働くのですが、他の形式のエラーがあります。

私はStackOverflowで多くの類似の質問を見つけましたが、すべてがURLリンクに関するものでした。私のアプリでは、アクティビティ内に「リンク」を作成したいと思っています。 一般的に、タグが別のものに変更される場合は、タグを別のタグに変更することができます...

私を手伝ってください! ありがとうございました!

-----解決済み----- アイデアのためにJacob Phillipsありがとう!

将来は誰かが面白いかもしれません。 これはコードです:

//This is my string; 
String str = "<b>Text</b> which contains one <a href='#'>link</a> and another <a href='#'>link</a>"; 
//TextView; 
TextView txt = new TextView(this); 
//Split string to parts:           
String[] devFull = data[v.getId()][1].split("<a href='#'>"); 
//Adding first part: 
txt.append(Html.fromHtml(devFull[0])); 
//Creating array for parts with links (they amount always will devFull.length-1): 
SpannableString[] link = new SpannableString[devFull.length-1]; 
//local vars: 
ClickableSpan[] cs = new ClickableSpan[devFull.length-1]; 
String linkWord; 
String[] devDevFull = new String[2]; 

for(int i=1; i<devFull.length; i++){ 
    //obtaining 'clear' link 
    devDevFull = devFull[i].split("</a>"); 
    link[i-1] = new SpannableString(devDevFull[0]); 
    linkWord = devDevFull[0]; 
    cs[i-1] = new ClickableSpan(){ 
     private String w = linkWord; 
     @Override 
     public void onClick(View widget) { 
      // here you can use w (linkWord) 
     } 
    }; 
    link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0); 
    txt.append(link[i-1]); 
    try{ 
     txt.append(Html.fromHtml(devDevFull[1])); 
    } 
    catch(Exception e){} 
} 

答えて

0

私が知っている最良の回避策は、独自のButtonクラスを作成することです。ボタンだけを透明な背景にすることで、テキストのみがユーザーに見えるようにすることができます。次に、ボタンを押したときに、ボタンのTextColorとTextStyleを暗い色と下線に変更します。これは、リンクとまったく同じように動作します。 startActivityを使用して、適切なアクティビティに移動できます。ハイパーリンクを使用してアプリケーション内の他のアクティビティに接続しないでください。

+0

ありがとう、私はボタンを使用することはできません。私のTextView内のテキストは静的ではないので、次回に "リンク"がどこに表示されるのかわかりません。テキストはDBから来て、何らかの形で私のlinkWordに印を付ける必要があります。 タグを使用しています... – lubart

+0

カスタムコンテンツを作成しようとしましたか? – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

0

私の個人的な意見は、あなたのリンクにしたいテキストを含む2番目のテキストビューを作成することでしょう。次に、この2番目のtextViewのonClickでアクションを実行できます。上記のzzzzzzzzzzzと同様に、そのテキストのフォントプロパティをクリックした後に変更することもできます。

+1

あなたの答えをありがとう、私はいくつかのpeacesのために私のTextViewを分割することはできません、私は1つの穴TextViewが必要です... – lubart

+0

本当に(私が正しく理解する場合、あなたが望むものです)内部アプリケーションのリンクを作るために、それを行う唯一の方法はOnClickメソッドを呼び出すことだと思うし、私はそれがテキストビューの特定の部分で行うことはできないと思う。あなたの答えはありがとうございます。 – testingtester

38

これはトリックを行う必要があります。編集テキストのテキストをOnClickListenerに変更してください。それは減らすことができるかもしれませんが、これはうまくいくはずです。

private void foo() { 
    SpannableString link = makeLinkSpan("click here", new View.OnClickListener() {   
     @Override 
     public void onClick(View v) { 
      // respond to click 
     } 
    }); 

    // We need a TextView instance.   
    TextView tv = new TextView(context); 

    // Set the TextView's text  
    tv.setText("To perform action, "); 

    // Append the link we created above using a function defined below. 
    tv.append(link); 

    // Append a period (this will not be a link). 
    tv.append("."); 

    // This line makes the link clickable! 
    makeLinksFocusable(tv); 
} 

/* 
* Methods used above. 
*/ 

private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) { 
    SpannableString link = new SpannableString(text); 
    link.setSpan(new ClickableString(listener), 0, text.length(), 
     SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); 
    return link; 
} 

private void makeLinksFocusable(TextView tv) { 
    MovementMethod m = tv.getMovementMethod(); 
    if ((m == null) || !(m instanceof LinkMovementMethod)) { 
     if (tv.getLinksClickable()) { 
      tv.setMovementMethod(LinkMovementMethod.getInstance()); 
     } 
    } 
} 

/* 
* ClickableString class 
*/ 

private static class ClickableString extends ClickableSpan { 
    private View.OnClickListener mListener;   
    public ClickableString(View.OnClickListener listener) {    
     mListener = listener; 
    }   
    @Override 
    public void onClick(View v) { 
     mListener.onClick(v); 
    }   
} 
+0

申し訳ありませんが、愚かな質問かもしれませんが、ClickableString()クラスは何ですか? – lubart

+0

私はちょうどそれを追加しました。私は同様の質問に[この回答](http://stackoverflow.com/a/5681946/884522)の修正版を使用しました –

+0

ありがとう!しかし、それは動作しません:( 私は行 'mListenerにエラーがあります。DialogInterface.OnClickListener型のonClick(DialogInterface、int)メソッドは引数(View)には適用されません。 と私はそれを修正する方法がわかりません。アイデアはありますか?とにかくありがとうございます! – lubart

9

より良いアプローチは

SpannableString ss = new SpannableString("Android is a Software stack"); 
    ClickableSpan clickableSpan = new ClickableSpan() { 
     @Override 
     public void onClick(View textView) { 
      startActivity(new Intent(MyActivity.this, NextActivity.class)); 
     } 
    }; 
    ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
//where 22 and 27 are the starting and ending index of the String. Now word stack is clickable 
// onClicking stack it will open NextActiivty 

    TextView textView = (TextView) findViewById(R.id.hello); 
    textView.setText(ss); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
+0

複数回クリックした場合 – Prasad

+0

http://stackoverflow.com/a/9982588/3496570およびhttp://stackoverflow.com/a/22006998/3496570 – Nepster

+0

がこのコピーを貼り付けているようです - http:// stackoverflow.com/a/10697453/1479511 – NarendraJi

0

は答えを混合しながら、それを完全な答えをすることです。

private void textAreaInit() 
{ 
    String str = "<a href='#'>Link 1</a> and <a href='#'>Link2</a> is here."; 

    TextView tv = mConfirmText; 
    String[] devFull = str.split("<a href='#'>"); 


    tv.append(Html.fromHtml(devFull[0])); 

    SpannableString[] link = new SpannableString[devFull.length-1]; 

    ClickableSpan[] cs = new ClickableSpan[devFull.length-1]; 
    String linkWord; 
    String[] devDevFull = new String[2]; 

    for(int i=1; i<devFull.length; i++) 
    { 
     //obtaining 'clear' link 
     devDevFull = devFull[i].split("</a>"); 
     link[i-1] = new SpannableString(devDevFull[0]); 
     linkWord = devDevFull[0]; 
     final String a = linkWord; 
     cs[i-1] = new ClickableSpan() 
     { 
      private String w = a; 
      @Override 
      public void onClick(View widget) { 

       if(w.equals("Link 1")) 
       { 
        Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class); 
        intent.putExtra("title", "Link1"); 
        intent.putExtra("uri", "link1"); 
        intent.putExtra("type", "1"); 
        startActivity(intent); 
       } 
       else 
       { 
        Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class); 
        intent.putExtra("title", "Link2"); 
        intent.putExtra("uri", "link2"); 
        intent.putExtra("type", "2"); 
        startActivity(intent); 
       } 
      } 
     }; 
     link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0); 
     tv.append(link[i-1]); 
     try{ 
      tv.append(Html.fromHtml(devDevFull[1])); 
     } 
     catch(Exception e){} 
    } 


    makeLinksFocusable(tv); 
} 

private void makeLinksFocusable(TextView tv) { 
    MovementMethod m = tv.getMovementMethod(); 
    if ((m == null) || !(m instanceof LinkMovementMethod)) { 
     if (tv.getLinksClickable()) { 
      tv.setMovementMethod(LinkMovementMethod.getInstance()); 
     } 
    } 
} 
関連する問題