ListView setOnItemClickListener no desencadena cuando un elemento tiene un vínculo en ello
Estoy trabajando en la integración de Twitter en una aplicación y mientras todo funciona como debería, estoy setOnItemClickListener()
en el setOnItemClickListener()
no se activa cuando un item
ListView
tiene un enlace en él. Funciona muy bien cuando un item
no tiene un enlace (URL) en él.
Al hacer clic en la URL se abre la página web en un navegador.
- Enlaces que no funcionan dentro de un WebView debido a 'X-Frame-Options' establecido en 'SAMEORIGIN'
- Android - Compartir en Facebook, Twitter, Correo, ecc
- Twitter Tejido o Twitter4j no oficial?
- ¿Ejemplo práctico de usar la API de Twitter en Android?
- Barra de acción de Android como muestra de twitter
Consulte las capturas de pantalla agregadas como referencia al final de la publicación.
Es un ListView
personalizado que emplea un BaseAdapter
. No estoy seguro de qué pieza de código para poner en, pero en ser señalado a un bloque de código que la gente aquí puede necesitar, voy a añadir de inmediato.
La idea detrás de la necesidad de ignorar los enlaces (URL) de un elemento es proporcionar una funcionalidad que muestra los detalles del tweet cuando un usuario hace clic en uno. Algo similar a lo que hace la aplicación de Twitter de Android.
Entonces, ¿qué debo hacer para que el setOnItemClickListener()
ignore los enlaces de los elementos?
ACTUALIZADO:
Bueno. Así que no estoy seguro de si es relevante para la pregunta, pero, a partir de una combinación de unas pocas soluciones de SO que me llevó al proyecto de código abierto TweetLanes , he logrado conseguir algunas cosas funcionando. Pero desafortunadamente, no aborda mi pregunta primaria.
¿Cómo puedo hacer que el setOnItemClickListener()
ignore los enlaces en un elemento para que pueda hacer clic en él y mostrar los detalles en otra actividad y, sin embargo, al hacer clic en un enlace, no activar el setOnItemClickListener()
? Sigo recibiendo soluciones parciales en cada intento que hago. Pero a veces, cuando hago clic en un link
, el setOnItemClickListener()
también se activa.
Así es como el flujo mira el momento:
En las dos primeras capturas de pantalla, funciona como debería. No hacer clic en un enlace después de todo.
En la parte inferior dos, sin embargo, cuando hago clic en el enlace @ibnlive , muestra el perfil para el usuario ( @ibnlive ). Esta parte se deriva de la fuente TweetLanes. El problema es que el oyente de clics también se activa. Esta es una de las soluciones que estoy probando. En este caso, he comentado el setOnItemClickListener()
y estoy usando un OnClickListener()
en el TextView
. Este es el método que tiene éxito parcial hasta ahora.
- Facebook y Twitter en vivo en las aplicaciones de Android
- ¿Dónde puedo encontrar el código fuente para las aplicaciones de gmail, facebook y twitter para Android? ¿Son incluso de código abierto?
- Inicio de sesión móvil de Facebook y validación del servidor
- Android twitter 4j integración obtener entidades tweet
- El inicio de sesión de Twitter de Android no funciona con Fabric SDK - La devolución de llamada no debe ser nula
- Cómo compartir la imagen http directamente a twitter en android?
- Responder a un tweet mediante intentos, a través de la aplicación nativa de Android
- Android twitter4j autenticación a través de la aplicación de twitter instalado no navegador
Probablemente quiera echar un vistazo a la respuesta de babay en ListView: TextView con LinkMovementMethod hace que el elemento de lista sea unclickable?
Él presenta un TextView que emite este problema básicamente introduciendo un LinkMovementMethod
diferente:
public static class LocalLinkMovementMethod extends LinkMovementMethod{ static LocalLinkMovementMethod sInstance; public static LocalLinkMovementMethod getInstance() { if (sInstance == null) sInstance = new LocalLinkMovementMethod(); return sInstance; } @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } if (widget instanceof TextViewFixTouchConsume){ ((TextViewFixTouchConsume) widget).linkHit = true; } return true; } else { Selection.removeSelection(buffer); Touch.onTouchEvent(widget, buffer, event); return false; } } return Touch.onTouchEvent(widget, buffer, event); } }
Solución NO PROBADA
Basándome en esto, te aconsejo arreglar el archivo TwitterLinkify.java
(la función que establece el movimiento del enlace) así:
private static final void addLinkMovementMethod(TextView t) { MovementMethod m = t.getMovementMethod(); if ((m == null) || !(m instanceof LocalLinkMovementMethod)) { if (t.getLinksClickable()) { t.setMovementMethod(LocalLinkMovementMethod.getInstance()); } } }
Gracias
Para respaldar los eventos de clics de listItem y los enlaces de soporte dentro de los registros, debes establecer android:descendantFocusability="blocksDescendants"
en el diseño de nivel superior del xml de tu lista-registro.
¿Has probado el siguiente código (basado en este enlace ):
textView.setMovementMethod(null);
?
EDIT: aquí hay una solución de trabajo:
textView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { // <=handle clicking here } return true; } });
Eso es porque el enlace es clicable y listItem también se puede hacer clic, por lo que aquí, el enlace toma el foco y, por tanto, listItem no se puede hacer clic.
Sólo tiene que configurar:
Establecer todos los elementos de android:focusable="false"
Y android:focusableInTouchMode="false"
de listItem.
Por favor, eche un vistazo a esto.
text_url.setText(Html.fromHtml(url.toString().trim())); Linkify.addLinks(text_url, Linkify.ALL);
Esta es la línea que estoy utilizando para mostrar la url en la vista de lista. Si usted hace las líneas antedichas en su getview el acoplamiento se convertirá en color azul con el subrayado automatically.if usted chasca ese uno que abrirá el browser automáticamente.
Espero que esto te ayudará.
EDITAR
Hola echa un vistazo a esta respuesta editada. Lo he verificado. Se abrirá la url correcta. Espero que esto te ayudará.
String url="www.google.com"; String name="@sampleuser"; textview1.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+name+"</a>")); textview1.setMovementMethod(LinkMovementMethod.getInstance());
EDIT 2 Hola, eche un vistazo a esta muestra. Espero que esto te ayudará .
package com.example.listwithclick; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { ListView listView1; Activity activity; ArrayList<String>urls=new ArrayList<String>(); ArrayList<String>name=new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activity=this; urls.add("www.google.com"); name.add("@googleuser"); urls.add("www.yahoo.com"); name.add("@yahoouser"); urls.add("www.facebook.com"); name.add("@facebookuser"); urls.add("www.linkedin.com"); name.add("@linkedinuser"); listView1=(ListView)findViewById(R.id.listView1); listView1.setAdapter(new MyAddapter(MainActivity.this)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } class MyAddapter extends BaseAdapter { Context rContext; private LayoutInflater rInflater; public MyAddapter(Context c) { rInflater = LayoutInflater.from(c); rContext = c; } public MyAddapter(Activity imagebinding) { // TODO Auto-generated constructor stub activity = imagebinding; rContext = imagebinding; rInflater = LayoutInflater.from(imagebinding); rContext = imagebinding; rInflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return urls.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub convertView = rInflater.inflate(R.layout.child, null); final MyDat mydat = new MyDat(); mydat.textview = (TextView) convertView.findViewById(R.id.textview_name); mydat.textview.setText(Html.fromHtml("<a href='http://"+urls.get(position).toString()+"'>"+name.get(position).toString()+"</a>")); mydat.textview.setMovementMethod(LinkMovementMethod.getInstance()); return convertView; } class MyDat { TextView textview; } } }
- Cómo invitar a los amigos de facebook a través de mi aplicación?
- Android: Cuando se cancela un servicio, ¿cómo podemos persistir el estado del servicio para una restauración posterior?