2012-04-02 30 views
24

我有TextView,其中的文本動態更改。該文本包含字符串如<a href='myWord'>myWord</a>。我想要點擊這個「鏈接」後myWord出現在同一活動的EditText中。Android中的TextView中的可點擊單詞0123:

這是我的代碼:

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

這對href屬性裏面的URL工作得很好,但對於另一種格式錯誤。

我發現了很多關於StackOverflow的類似問題,但他們都是約URL鏈接。在我的應用程序中,我想在活動中創建「鏈接」。 一般情況下,我可以改變標籤有的另一如果它是依賴...

請幫幫我! 謝謝!

----- -----解決 謝謝雅各菲利普斯的想法!

可能會在未來有趣的人。 這是一個代碼:

//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類。您可以使Button具有透明背景,以便用戶只能看到文本。然後當按下按鈕時,將按鈕的TextColor和TextStyle更改爲更深的顏色並加下劃線。這可以像鏈接一樣工作。然後,您可以使用startActivity轉到適當的活動。您不應該使用超鏈接連接到應用程序中的其他活動。

+0

謝謝你的回答,但我不能使用Button。我TextView中的文本不是靜態的,我不知道下一次我的「鏈接」將出現在哪裏。文本來自DB,我需要以某種方式標記我的linkWord。我正在使用標記... – lubart 2012-04-02 01:18:45

+0

您是否嘗試過創建自定義內容uri? – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2012-04-02 01:27:46

0

我個人的看法是使包含你想成爲你的鏈接的文本第二TextView的。然後,您可以在第二個textView的onClick中執行您的操作。同樣如上面所述的zzzzzzzzzzz,您可以選擇將該文本的字體屬性更改爲任何您想要的內容,一旦它被點擊。

+1

謝謝你的答案,但我不能分割我的TextView的幾個撕成小塊,我需要一個孔的TextView ... – lubart 2012-04-02 01:21:54

+0

爲了真正使一個內部應用程序的鏈接(這是你想要什麼,如果我理解正確的話),我認爲做到這一點的唯一方法是調用OnClick方法,我認爲這是不可能在textview的特定部分進行的。雖然 – testingtester 2012-04-02 01:29:21

38

這應該可以做到。只需更改OnClickListener中的edittext文本即可。它可能會減少,但這應該工作。

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 2012-04-02 10:06:39

+0

我剛添加它。我使用了[這個答案]的修改版本(http://stackoverflow.com/a/5681946/884522)給一個類似的問題 – 2012-04-02 19:16:55

+0

謝謝!但它不起作用:( 我在'mListener行有錯誤。的onClick(V);'在ClickableString類: '在類型DialogInterface.OnClickListener方法的onClick(DialogInterface,INT)不適用於參數(查看)' ,我不知道如何糾正它。你有什麼想法。 無論如何謝謝你! – lubart 2012-04-02 21:38:59

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 2015-06-24 11:19:06

+0

看看http://stackoverflow.com/a/9982588/3496570和http://stackoverflow.com/a/22006998/3496570 – Nepster 2015-06-24 12:12:19

+0

似乎複製粘貼此 - HTTP:// stackoverflow.com/a/10697453/1479511 – NarendraJi 2015-11-09 09:49:56

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()); 
     } 
    } 
} 
相關問題