2011-05-06 19 views
8

Estoy cargando la vista web con Html String, quiero mostrar los botones de navegación cuando el usuario toca en la vista web, intenté Con el oyente onTouch, toque evento aumenta al desplazarse y tocar pero i quiere coger solo toque/ClickEvent, se desplaza toca Evento ..., he implementado SetOnClickListener tanto para WebView y LinearLayout, ninguno de ellos no está funcionando para mí Cualquier ayuda con respecto a esteAndroid singleTap/OnClick en WebView

Respuesta

24

WebView no soporta el OnClickListener. Y también consume eventos táctiles aunque no pasó nada en la página web, por lo que las vistas de los antepasados ​​(como su LinearLayout) no tienen ninguna posibilidad de producir un evento OnClick. Es muy desafortunado

Como una solución extendí un RelativeLayout y puse mi WebView dentro de él. En el RelativeLayout he sobrescrito onInterceptTouchEvent y estaba buscando eventos tap. Si se detecta un toque, se invoca RelativeLayout's OnClickListener con performClick().

public class TapAwareRelativeLayout extends RelativeLayout { 

    private final float MOVE_THRESHOLD_DP = 20 * getResources().getDisplayMetrics().density; 

    private boolean mMoveOccured; 
    private float mDownPosX; 
    private float mDownPosY; 

public TapAwareRelativeLayout(Context context) { 
    super(context); 
} 

public TapAwareRelativeLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 

    final int action = ev.getAction(); 
    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
     mMoveOccured = false; 
     mDownPosX = ev.getX(); 
     mDownPosY = ev.getY(); 
     break; 
    case MotionEvent.ACTION_UP: 
     if (!mMoveOccured) { 
      // TAP occured 
      performClick(); 
     } 
     break; 
    case MotionEvent.ACTION_MOVE: 
     if (Math.abs(ev.getX() - mDownPosX) > MOVE_THRESHOLD_DP || Math.abs(ev.getY() - mDownPosY) > MOVE_THRESHOLD_DP) { 
      mMoveOccured = true; 
     } 
     break; 

    } 
    return super.onInterceptTouchEvent(ev); 
} 

}

+0

Hey @Saffer puede u por favor dar algunos datos podrían Forma de usar este. gracias .. – sandy

+0

@Zsolt - No encontré cómo poner webView en RelativeLayout, ¿podrían dar más información al respecto? – Braj

+0

Colocas WebView en RelativeLayout en el archivo de diseño xml. El tamaño que especificó para WebView antes ahora es la especificación de tamaño de RelativeLayout y usted hace que WebView coincida con el tamaño de su elemento principal (RelativeLayout). Esto les hará tener el mismo tamaño mientras RelativeLayout envuelve WebView. –

2

que modifica la respuesta de Zsolt Sáfrány y me puso su contenido onInterceptTouchEvent 's en el método de vista web onTouch y funcionó.

webview.setOnTouchListener(new View.OnTouchListener() { 
@Override 
public boolean onTouch(View v, MotionEvent event) { 
    Log.v(TAG,"Got a touch event in the web view!"); 

    final int action = ev.getAction(); 
    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      mMoveOccured = false; 
      mDownPosX = ev.getX(); 
      mDownPosY = ev.getY(); 
     break; 
     case MotionEvent.ACTION_UP: 
      if (!mMoveOccured) { 
      //click operation is here 
      } 
     break; 
     case MotionEvent.ACTION_MOVE: 
      if (Math.abs(ev.getX() - mDownPosX) > MOVE_THRESHOLD_DP || Math.abs(ev.getY() - mDownPosY) > MOVE_THRESHOLD_DP) { 
      mMoveOccured = true; 
     } 
     break; 
} 
    return false; 
}   }); 
+0

Esta solución contiene errores (event y ev.getX()) y funciona como la primera solución, es decir, no funciona. – CoolMind

0

código :: Trabajado

final Boolean[] mMoveOccured = new Boolean[1]; 
final float[] mDownPosX = new float[1]; 
final float[] mDownPosY = new float[1]; 

final float MOVE_THRESHOLD_DP = 20 * getResources().getDisplayMetrics().density; 

userPic.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      final int action = event.getAction(); 
      switch (action) { 
       case MotionEvent.ACTION_DOWN: 
        mMoveOccured[0] = false; 
        mDownPosX[0] = event.getX(); 
        mDownPosY[0] = event.getY(); 
        break; 
       case MotionEvent.ACTION_UP: 
        if (!mMoveOccured[0]) { 
         Toast.makeText(v.getContext(), "Webview pressed", Toast.LENGTH_SHORT).show(); 
        } 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (Math.abs(event.getX() - mDownPosX[0]) > MOVE_THRESHOLD_DP || Math.abs(event.getY() - mDownPosY[0]) > MOVE_THRESHOLD_DP) { 
          mMoveOccured[0] = true; 
        } 
        break; 
      } 
      return false; 
     } 
});