2009-11-08 2 views

Antwort

22

Dies geschieht mit dem AutoLink-Attribut eines TextView. Es dauerte einige Zeit, um die Dokumentation zu durchforsten, um sie an einem Beispiel zu platzieren, falls jemand anderes danach sucht:

Nehmen wir an, dass Sie Ihren ListView an einen benutzerdefinierten Adapter binden. In diesem Fall geht das folgende Stück Code in Ihren getView Aufruf:

Code:

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

einfach den Link setzt innerhalb des Text des setText Anruf weitergeleitet werden und du bist fertig.

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"/> 

Hoffnung, dass ...

+1

Das funktionierte tatsächlich nicht für mich - die einzelnen Links blieben in Items, die im ListView sind, nicht anklickbar, aber die Lösung von Emmby funktionierte großartig. –

+0

Vielen Dank, half mit meinem ListView. – rwarner

17

hilft Wenn du einen Text haben, die bereits im HTML-Format ist, das Beste, was zu tun ist folgendes:

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

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

Dadurch werden alle Link-Tags in Ihrer Textansicht anklickbar. Alternativ könnten Sie android:autoLink="web" verwenden, wie von Legend vorgeschlagen, aber dies hat den Nebeneffekt von a) Verknüpfen von URLs, die nicht in Anker-Tags eingeschlossen sind, und b) potenziell fehlenden URLs oder Verknüpfen von Dingen, die keine URLs sind. Wenn Sie die SmartS von AutoLink wollen, dann sollten Sie es verwenden, aber wenn Sie nur die bereits vorhandenen Tags verknüpfen möchten, verwenden Sie besser setMovementMethod().

diesen Bug-Report für mehr Details: http://code.google.com/p/android/issues/detail?id=2219

+0

Vielen Dank, hat super funktioniert. –

+3

Hmm, es scheint, dass das Hinzufügen von textcontent.setMovementMethod (LinkMovementMethod.getInstance()); macht es so, dass die Klicks auf die Textteile der Textansicht nicht mehr in die Listenansicht darunter gelangen. –

+0

Dies ist die korrekteste Antwort auf die gestellte Frage. BeerMes Antworten behebt die Probleme mit dem ListView-Objekt, das nicht klickbar ist. – juil

10

Hmm, scheint es, dass das Hinzufügen von textcontent.setMovementMethod (LinkMovementMethod.getInstance()); macht es so, dass die Klicks auf die Textteile der Textansicht nicht mehr in die Listenansicht darunter gelangen.

fand ich eine einfache Abhilfe unter Issue 3414, Comment 27:

Eine einfache Möglichkeit, dieses Problem zu umgehen, ist zu nennen "setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS);" in den Listenansichten, wenn sie hinzugefügt werden. Sie können Zeilen auswählen, auf Zeilen klicken und auf untergeordnete Kontrollkästchen und Schaltflächen klicken.

Es funktionierte perfekt für mich, obwohl einige Casting erforderlich war:

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

Wo fügen Sie die DesecendantFocusability hinzu? Zur ListView oder zum ListItem? Ich folgte Ihrem Beispiel, um anklickbare Links hinzuzufügen, aber wenn ich auf nicht verlinkte Teile meiner Textansicht klicke, wird das Ereignis nicht an die übergeordnete Ansicht des Listeneintrags oder an die Listenansicht übergeben ... – ffleandro

+0

Ich benutze es wie folgt: public Anzeigen von getView (int-Position, View convertView, ViewGroup-Parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInFlater) context.getSystemService (Kontext.LAYOUT_INFLATER_SERVICE); v = vi.inflation (itemLayout, null); } ... ((ViewGroup) v) .setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); Rückkehr v; } Ich habe nicht überprüft, was mit dem Ereignis passiert, wenn ein Nicht-Link-Teil angeklickt wird. (Nicht sicher, warum ich den Code nicht formatieren kann ... sorry.) –

1

Sie benötigen eine Funktion setOnItemClickListener einstellen() und in ihm so etwas wie dies erklären:

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

Die tricky Teil von listview ist nichts drin (zum Beispiel ein TextView eines Buttons) ist anklickbar!

Grundsätzlich benötigen Sie zwei String-Arrays:

  1. Namen, die Benutzer auf dem list_view sehen;
  2. Hyperlinks, die Sie anweisen sollen, zu gehen.

Im 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> 

Im layout_search_provider.xml enthält es eine Listenansicht:

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/lv_search" 
    android:dividerHeight="1dp"/> 

In Ihrer Tätigkeit:

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

} 

Wenn Ihr Liste ist dynamisch, Sie können die folgende (n) Methode (en) zum Aktualisieren Ihrer Listenansicht verwenden.

  • Verschieben Sie den Code in onCreateView() in onResume().
  • sAdapter.notifyDataSetChanged();