2009-11-08 32 views

Respuesta

22

Esto se hace mediante el atributo autoLink de un TextView. Me llevó algo de tiempo hurgar en la documentación para ponerla aquí con un ejemplo en caso de que alguien más la esté buscando:

Supongamos que está vinculando su vista de lista a un adaptador personalizado. En ese caso, el siguiente fragmento de código entra en su llamada getView:

Código:

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

Sólo hay que poner el enlace dentro del texto que se pasa a la llamada setText y ya está.

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

Espero que ayude ...

+1

En realidad, esto no funcionó para mí: los enlaces individuales no se podían cliquear en los elementos que están en ListView, pero la solución de emmby funcionó muy bien. –

+0

Gracias muchísimo, ayudado con mi ListView. – rwarner

17

Si tiene texto que ya está en formato HTML, lo mejor que puede hacer es la siguiente:

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

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

Esto hará que cualquier etiqueta de enlace pueda hacer clic en su vista de texto. Alternativamente, podría usar android:autoLink="web" según lo sugerido por Legend, pero esto tiene el efecto secundario de a) vincular URLs que no están envueltas en etiquetas de anclaje, yb) potencialmente faltan urls o enlaces de cosas que no son urls. Si desea la inteligencia de autoLink, entonces debe usarla, pero si todo lo que quiere es vincular las etiquetas que ya están allí, es mejor que use setMovementMethod().

ver este informe de error para más detalles: http://code.google.com/p/android/issues/detail?id=2219

+0

Gracias, funcionó muy bien. –

+3

Hmm, parece que agregar textcontent.setMovementMethod (LinkMovementMethod.getInstance()); hace que los clics en las partes de texto de la vista de texto ya no se transmitan a la vista de lista a continuación. –

+0

Esta es la respuesta más correcta a la pregunta. Las respuestas de BeerMe corrigen los problemas con el elemento ListView que no se puede cliquear. – juil

10

Hmm, parece que la adición de textcontent.setMovementMethod (LinkMovementMethod.getInstance()); hace que los clics en las partes de texto de la vista de texto ya no se transmitan a la vista de lista a continuación.

encontré una solución simple bajo Issue 3414, Comment 27:

Una manera fácil de solucionar este problema es llamar "setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS);" en la lista Vea las vistas a medida que se agregan. Podrá seleccionar filas, hacer clic en las filas y hacer clic en las casillas y botones secundarios.

funcionó perfectamente para mí, aunque no se requiere algo de calidad:

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

¿Dónde se agrega el desecamiento? ¿A ListView o al ListItem? Seguí tu ejemplo para agregar enlaces clicables, sin embargo, al hacer clic en partes no vinculadas de mi vista de texto, el evento no se pasa a la vista principal del elemento de lista o a la vista de lista ... – ffleandro

+0

Lo uso así: público Ver getView (int position, View convertView, ViewGroup parent) { Ver 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; } No he comprobado para ver qué sucede con el evento si se hace clic en una parte que no sea de enlace. (No estoy seguro de por qué no puedo obtener el código para formatear ... lo siento). –

1

Es necesario configurar un setOnItemClickListener función() y en su interior declarar algo como esto:

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

El ¡La parte difícil de la vista de lista no es nada dentro (por ejemplo, una Vista de texto de un botón) se puede hacer clic!

Básicamente se necesitan dos matrices de cadenas:

  1. nombres que los usuarios ven en la list_view;
  2. hipervínculos a los que desea dirigirlos.

En el 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> 

En el layout_search_provider.xml que contiene una vista de lista:

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

En su actividad:

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

} 

Cuando su la lista es dinámica, puede usar los siguientes métodos para actualizar su lista de la lista.

  • mueve el código en onCreateView() a onResume().
  • sAdapter.notifyDataSetChanged();
Cuestiones relacionadas