2011-02-11 4 views
9

Tengo un ListView donde cada fila tiene dos vistas web una al lado de la otra, ocupando toda la fila. Configuré onListItemClick() en mi ListActivity, pero no se activan cuando pulso en una de las filas (a menos que el lugar al que toque esté fuera del borde de la vista web, pero este no es el comportamiento probable, los usuarios lo harían más probablemente desee tocar la imagen dentro de la vista web).Android WebView dentro de ListView en cuestión de eventos del clculo

He intentado configurar setFocusable (falso) y setFocusableInTouchMode (falso), pero esos no ayudan.

ideal sería que esto funcionaría exactamente como fuente de noticias de Facebook, donde puede tocar en la imagen de perfil de la publicación en el muro de alguien y que actúa como si hubiera tocado toda la fila (en el caso de los FB el texto de la publicación en el muro)

Respuesta

21

Lo encontré, publicando mi solución en caso de que alguien más quiera hacer algo similar:

Tuve que usar un OnTouchListener, ya que OnClick y OnFocus no funcionaban. Extendí una clase que es reutilizable:

private class WebViewClickListener implements View.OnTouchListener { 
    private int position; 
    private ViewGroup vg; 
    private WebView wv; 

    public WebViewClickListener(WebView wv, ViewGroup vg, int position) { 
     this.vg = vg; 
     this.position = position; 
     this.wv = wv; 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 

     switch (action) { 
      case MotionEvent.ACTION_CANCEL: 
       return true; 
      case MotionEvent.ACTION_UP: 
       sendClick(); 
       return true; 
     } 

     return false; 
    } 

    public void sendClick() { 
     ListView lv = (ListView) vg; 
     lv.performItemClick(wv, position, 0); 
    } 
} 

El método sendClick podría ser anulado para hacer lo que se necesita en su caso específico. Caso de uso:

WebView image = (WebView) findViewById(R.id.myImage); 
image.setOnTouchListener(new WebViewClickListener(image, parent, position)); 
+0

intenté esto. No funcionó para mí. gracias por cualquier otra idea. – Raj

+0

¡Esto funciona como debería! ¡Gracias!. Puede usarlo con establecer y obtener etiquetas en algunos casos de la vida real. – superUser

7

me las arreglé para conseguir este funcionamiento con lo siguiente:

class NoClickWebView extends WebView { 
    public NoClickWebView(Context context) { 
     super(context); 
     setClickable(false); 
     setLongClickable(false); 
     setFocusable(false); 
     setFocusableInTouchMode(false); 
    } 
} 

Puede utilizar esta clase o simplemente establecer estas propiedades en una vista Web estándar.

+0

¡Impresionante! Gracias. Funcionó perfecto para mí. –

+1

Parece que no funciona en 4.4:/ – Aviel

1

Estaba usando el siguiente diseño en ListView y estaba funcionando perfectamente, es decir, haciendo clic, desplazándose, etc.

TextView1 
ImageView1 TextView2 ImageView2 
TextView3 

entonces he cambiado el diseño con siguiente, es decir, he añadido con el control WebView de más a la izquierda en lugar de esquina ImageView1

TextView1 
WebView TextView2 ImageView2 
TextView3 

Después de hacer esto, al hacer clic no estaba trabajando para mí.

puedo solucionar este problema mediante la adición de esto a la vista Web:

webView.setFocusable(false); 
webView.setClickable(false); 
3

instalación para la disposición de los padres de cada WebView:

android:descendantFocusability="blocksDescendants" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
5

¡Gracias trabajar en Android 4.4 utilizando el mismo enfoque que bjdodson anteriormente pero también anulando el despachoTouchEvent

public class NonClickableWebview extends WebView { 
    public NonClickableWebview(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setClickable(false); 
     setLongClickable(false); 
     setFocusable(false); 
     setFocusableInTouchMode(false); 
    } 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     return false; 
    } 
} 
+0

gracias. funcionó para mí después de probar todas las soluciones anteriores. – Raj

+2

Esta solución funciona bien, mientras que los otros parecían ser un poco más trabajo. Tenga en cuenta que en las técnicas "modernas" de Android Studio-ish, la manera más fácil de lograr esto es agregar un nuevo archivo de clase con este código, crear un 'WebView' normal en su archivo de diseño XML, luego editar el XML, reemplazando' WebView' con 'com.myapp.NonClickableWebview' Después de eso, su código es algo así como' (NonClickableWebview) myView = (NonClickableWebview) findViewById (R.id.myView); 'pero de lo contrario puede abordarlo como un' WebView estándar ' –

Cuestiones relacionadas