Je veux juste savoir quand l'utilisateur clique sur Webview autre que sur l'hyperlien. Sur ce clic, je souhaite afficher / masquer une vue de mon activité qui contient la vue Web. Toute suggestion?
Réponses
Trop de publicités?J'ai pris un coup d'oeil à tout ça et j'ai trouvé que l' WebView
ne semble pas à l'envoyer sur les événements à OnClickListener
. Si quelqu'un peut me prouver le contraire ou dites-moi pourquoi, alors, je serais curieux de l'entendre.
Ce que j'ai trouvé est qu'un WebView
enverra les événements tactiles à un OnTouchListener
. Il possède son propre onTouchEvent
méthode mais je n'ai jamais semblait MotionEvent.ACTION_MOVE
à l'aide de cette méthode.
Donc, étant donné que nous pouvons obtenir événements sur une marque tactile écouteur d'événement, le seul problème qui demeure est de savoir comment contourner toute action que vous souhaitez effectuer pour une touche lorsque l'utilisateur clique sur une URL.
Ceci peut être réalisé avec un peu de fantaisie Handler
jeu de jambes par l'envoi d'un message retardé pour le toucher, puis la suppression de ces messages tactiles si le contact a été causé par l'utilisateur en cliquant sur une URL.
Voici un exemple:
public class WebViewClicker extends Activity implements OnTouchListener, Handler.Callback {
private static final int CLICK_ON_WEBVIEW = 1;
private static final int CLICK_ON_URL = 2;
private final Handler handler = new Handler(this);
private WebView webView;
private WebViewClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web_view_clicker);
webView = (WebView)findViewById(R.id.web);
webView.setOnTouchListener(this);
client = new WebViewClient(){
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
handler.sendEmptyMessage(CLICK_ON_URL);
return false;
}
};
webView.setWebViewClient(client);
webView.setVerticalScrollBarEnabled(false);
webView.loadUrl("http://www.example.com");
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.web && event.getAction() == MotionEvent.ACTION_DOWN){
handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 500);
}
return false;
}
@Override
public boolean handleMessage(Message msg) {
if (msg.what == CLICK_ON_URL){
handler.removeMessages(CLICK_ON_WEBVIEW);
return true;
}
if (msg.what == CLICK_ON_WEBVIEW){
Toast.makeText(this, "WebView clicked", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
Espérons que cette aide.
Vous pouvez implémenter un OnClickListener via OnTouchListener:
webView.setOnTouchListener(new View.OnTouchListener() {
public final static int FINGER_RELEASED = 0;
public final static int FINGER_TOUCHED = 1;
public final static int FINGER_DRAGGING = 2;
public final static int FINGER_UNDEFINED = 3;
private int fingerState = FINGER_RELEASED;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED;
else fingerState = FINGER_UNDEFINED;
break;
case MotionEvent.ACTION_UP:
if(fingerState != FINGER_DRAGGING) {
fingerState = FINGER_RELEASED;
// Your onClick codes
}
else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED;
else fingerState = FINGER_UNDEFINED;
break;
case MotionEvent.ACTION_MOVE:
if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING;
else fingerState = FINGER_UNDEFINED;
break;
default:
fingerState = FINGER_UNDEFINED;
}
return false;
}
});
Je pense que vous pouvez également utiliser l'état MotionEvent.ACTION_UP, par exemple:
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.iv:
if (event.getAction() == MotionEvent.ACTION_UP) {
if (isheadAndFootShow == false) {
headLayout.setVisibility(View.VISIBLE);
footLayout.setVisibility(View.VISIBLE);
isheadAndFootShow = true;
} else {
headLayout.setVisibility(View.INVISIBLE);
footLayout.setVisibility(View.INVISIBLE);
isheadAndFootShow = false;
}
return true;
}
break;
}
return false;
}