2009-11-08 16 views

risposta

22

Questo viene eseguito utilizzando l'attributo autoLink di un TextView. Mi ci è voluto un po 'di tempo per esaminare la documentazione, inserendola qui con un esempio nel caso in cui qualcun altro la stia cercando:

Supponiamo che tu leghi la tua listview ad un adattatore personalizzato. In tal caso, il seguente pezzo di codice va nella vostra chiamata GetView:

Codice:

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

Basta mettere il link all'interno del testo viene passato alla chiamata setText e il gioco è fatto.

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

Speranza che aiuta ...

+1

Questo in realtà non ha funzionato per me: i singoli collegamenti sono rimasti invalicabili in elementi presenti in ListView, ma la soluzione di emmby ha funzionato benissimo. –

+0

Grazie mille, aiutato con il mio ListView. – rwarner

17

Se hai testo che è già in formato HTML, la cosa migliore da fare è il seguente:

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

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

Ciò farà sì che i tag di collegamento siano selezionabili nella visualizzazione del testo. In alternativa, è possibile utilizzare android:autoLink="web" come suggerito da Legend, ma questo ha l'effetto collaterale di a) collegando gli URL che non sono racchiusi tra tag di ancoraggio e b) potenzialmente mancanti URL o che collegano elementi che non sono URL. Se vuoi l'intelligenza di autoLink, dovresti usarlo, ma se tutto quello che vuoi è collegare i tag che ci sono già, è meglio usare setMovementMethod().

Vai a questa segnalazione di bug per maggiori dettagli: http://code.google.com/p/android/issues/detail?id=2219

+0

Grazie, ha funzionato alla grande. –

+3

Hmm, sembra che aggiunga textcontent.setMovementMethod (LinkMovementMethod.getInstance()); fa in modo che i clic sulle parti di testo della textview non vengano più passati alla vista elenco qui sotto. –

+0

Questa è la risposta più corretta alla domanda posta. Le risposte di BeerMe risolvono i problemi con l'oggetto ListView diventando non modificabile. – juil

10

Hmm, sembra che l'aggiunta di textcontent.setMovementMethod (LinkMovementMethod.getInstance()); fa in modo che i clic sulle parti di testo della textview non vengano più passati alla vista elenco qui sotto.

ho trovato una soluzione semplice sotto Issue 3414, Comment 27:

Un modo semplice per ovviare a questo problema è quello di chiamare "setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS);" sulla listaVisualizza le viste man mano che vengono aggiunte. Sarai in grado di selezionare le righe, fare clic sulle righe e fare clic su caselle e pulsanti secondari.

ha funzionato perfettamente per me, anche se alcuni di fusione è stato richiesto:

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

Dove si aggiunge la predisposizione alla messa a fuoco? Al ListView o al ListItem? Ho seguito il tuo esempio per aggiungere link cliccabili, tuttavia quando clicco su parti non link della mia textview, l'evento non viene passato alla vista genitore del listitem o alla listview ... – ffleandro

+0

Io lo uso in questo modo: pubblico Visualizza getView (int position, Visualizza convertView, ViewGroup parent) { Visualizza v = convertView; if (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; } Non ho controllato per vedere cosa succede all'evento se si fa clic su una porzione non collegata. (Non sono sicuro del motivo per cui non riesco a ottenere il codice da formattare ... mi dispiace.) –

1

È necessario impostare una funzione setOnItemClickListener() e al suo interno dichiarare qualcosa di simile:

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

Il la parte difficile di listview non è nulla all'interno (ad esempio un TextView di un pulsante) è cliccabile!

Fondamentalmente è necessario due array di stringhe:

  1. nomi che gli utenti vedono sul list_view;
  2. collegamenti ipertestuali che si desidera indirizzarli.

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

Nel layout_search_provider.xml essa contiene una vista elenco:

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

Nella vostra attività:

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

} 

Quando il l'elenco è dinamico, è possibile il seguente metodo (s) per aggiornare il listview.

  • spostare il codice in onCreateView() in onResume().
  • sAdapter.notifyDataSetChanged();
Problemi correlati