2009-11-08 38 views

回答

22

這是通過使用TextView的autoLink屬性完成的。花了我一些時間來仔細閱讀文檔,以便將其放在這裏以示例,以防別人正在尋找它:

讓我們假設您將listview綁定到自定義適配器。在這種情況下,下面這段代碼進入您的通話getView:

代碼:

textcontent.setText(Html.fromHtml(item.get_text())); 
textcontent.setAutoLinkMask(Linkify.WEB_URLS); 

只要把裏面的文字傳遞給呼叫的setText的鏈接,你就大功告成了。

XML:

<TextView 
       android:id="@+id/txtview" 
       android:autoLink="web" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:text="put your link here"/> 

希望幫助...

+1

這實際上並沒有爲我工作 - 個別環節留在那些在ListView項目無法點擊,但emmby的解決方案很好工作。 – 2011-06-06 19:35:17

+0

非常感謝,我的ListView幫助。 – rwarner 2013-02-27 17:35:24

17

如果您有文本已在HTML格式的,做的最好的事情是:

TextView textcontent = (TextView) findViewById(...); 
textcontent.setMovementMethod(LinkMovementMethod.getInstance()); 

String text = "<a href="http://www.stackoverflow.com">stackoverflow.com</a>"; 
textcontent.setText(Html.fromHtml(text)); 

這將導致任何鏈接標籤在您的文本視圖中可點擊。或者,您可以按照Legend的建議使用android:autoLink="web",但這會產生以下副作用:a)鏈接未包裹在錨標記中的網址,以及b)可能會丟失網址或鏈接不是網址的內容。如果你想要自動鏈接的智能,那麼你應該使用它,但如果你想要的只是鏈接已經存在的標籤,你最好使用setMovementMethod()

詳情請參見本bug報告: http://code.google.com/p/android/issues/detail?id=2219

+0

謝謝你,工作很棒。 – 2011-06-06 19:37:09

+3

嗯,似乎加入textcontent.setMovementMethod(LinkMovementMethod.getInstance());使得textview文本部分的點擊不再傳遞到下面的列表視圖。 – 2011-06-06 20:22:20

+0

這是所問問題的最正確答案。 BeerMe的答案解決了ListView項目變得無法點擊的問題。 – juil 2016-07-10 01:31:22

10

嗯,看來,加入textcontent.setMovementMethod(LinkMovementMethod.getInstance());使得textview文本部分的點擊不再傳遞到下面的列表視圖。

我發現了一個簡單的解決方法Issue 3414, Comment 27下:

一個簡單的方法來解決此問題是調用 「setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);」在添加列表視圖視圖時添加 。 您將能夠選擇行,單擊行並單擊子複選框和按鈕。

它的工作完美的我,雖然有些鑄件要求:

View v; 
((ViewGroup)v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
+0

你在哪裏添加了desecendantFocusability?到ListView或ListItem?在我的TextView的非鏈接部分,當點擊我跟着你的例子添加可點擊的鏈接,但是,事件不會傳遞到列表項的父視圖或列表視圖... – ffleandro 2013-06-25 03:47:34

+0

我用這樣的: 公衆查看getView(int的位置,查看convertView,ViewGroup的父){ 查看v = convertView; 如果(V == NULL){ LayoutInflater VI =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(itemLayout,null); } ... ((ViewGroup中)V).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); return v; } 我還沒有檢查,看看是否被點擊的非鏈接部分發生了什麼事件。 (不知道爲什麼我不能得到格式的代碼...抱歉。) – 2013-09-09 17:54:48

1

您需要設置一個功能setOnItemClickListener(),並在其內部聲明是這樣的:

Uri uri = Uri.parse("http://www.google.com"); 
startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
0

的棘手的一部分listview是沒有(例如一個Button的TextView)可點擊!

基本上你需要兩個字符串數組:

  1. 名用戶在list_view看;
  2. 超鏈接,你想引導他們去。

在array.xml:

<string-array name="search_provider_name_array"> 
    <item>Google</item> 
    <item>Yahoo</item> 
    <item>Bing</item> 
    <item>Baidu</item> 
</string-array> 
<string-array name="search_provider_link_array"> 
    <item>https://www.google.com</item> 
    <item>https://www.yahoo.com</item> 
    <item>https://www.bing.com</item> 
    <item>https://www.baidu.com</item> 
</string-array> 

在layout_search_provider.xml它包含一個列表視圖:

​​

在你的活動:

public class SearchProvider implements AdapterView.OnItemClickListener { 
    private ListView lv_search; 
    private String[] names = getResources().getStringArray(R.array.search_provider_name_array); 
    private String[] links = getResources().getStringArray(R.array.search_provider_link_array); 

    //.. 

    @Override 
    public View onCreateView(View v, String name, Context context, AttributeSet attrs) { 
     lv_search= (ListView) v.findViewById(R.id.lv_search); 

     ArrayAdapter sAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, names); 
     lv_search.setAdapter(sAdapter); 
     lv_search.setOnItemClickListener(this); 

     return v; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     if(i<links.length){ 
      Uri uri = Uri.parse(links[i]); 
      Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
      startActivity(intent); 
     } 
    } 

} 

當你的列表是動態的,你可以通過下面的方法來更新你的列表視圖。

  • 將onCreateView()中的代碼移動到onResume()中。
  • sAdapter.notifyDataSetChanged();