2011-05-06 23 views
8

sto caricando Web view con Html String, voglio mostrare i pulsanti di navigazione quando l'utente tocca la visualizzazione web, ho provato Con ascoltatore onTouch, tocca evento solleva quando si scorre e tocca ma i vuole cogliere solo tocco/ClickEvent, non scorre evento tocca ..., ho implementato SetOnClickListener sia per WebView e LinearLayout, nessuno di loro non sta lavorando per me Qualsiasi aiuto per quanto riguarda questoAndroid singleTap/OnClick in WebView

risposta

24

WebView non supporta il OnClickListener. Inoltre consuma gli eventi touch anche se non è successo nulla sulla pagina Web, pertanto le visualizzazioni degli antenati (come il tuo LinearLayout) non hanno alcuna possibilità di produrre un evento OnClick. È molto sfortunato.

Come soluzione temporanea, ho esteso uno RelativeLayout e ho inserito il mio WebView all'interno di esso. Nel numero RelativeLayout ho sovrascritto onInterceptTouchEvent e stavo cercando gli eventi tocco. Se viene rilevato un tocco, viene richiamato lo RelativeLayoutOnClickListener 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 può u si prega di fornire alcuni dettagli potrebbero come usare questo. grazie .. – sandy

+0

@ Zsolt - Non ho avuto la possibilità di inserire webView in RelativeLayout, potresti fornire maggiori informazioni su questo? – Braj

+0

Si inserisce la visualizzazione Web in RelativeLayout nel file di layout xml. La dimensione u specificata per la WebView prima è ora la specifica della dimensione di RelativeLayout e si fa in modo che WebView corrisponda esattamente alla dimensione del suo genitore (RelativeLayout). Ciò li renderà della stessa dimensione mentre RelativeLayout esegue il wrapping di WebView. –

2

Ho modificato la risposta di Zsolt Safrany e ho messo il suo contenuto onInterceptTouchEvent s' nel metodo di visualizzazione web onTouch e ha funzionato.

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

Questa soluzione contiene errori (event ed ev.getX()) e funziona come prima soluzione, cioè non funziona. – CoolMind

0

Ha lavorato codice ::

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