Я посмотрел на это и обнаружил, что WebView
, похоже, не отправляет события щелчка на OnClickListener
.Если кто-то может доказать, что я не прав или сказать почему, то мне было бы интересно это услышать.
Я обнаружил, что WebView
будет отправлять сенсорные события на OnTouchListener
.У него есть свой собственный метод onTouchEvent
, но мне показалось, что я получал MotionEvent.ACTION_MOVE
только с помощью этого метода.
Итак, учитывая, что мы можем получать события на зарегистрированном приемнике событий касания, единственная проблема, которая остаетсячтобы обойти любое действие, которое вы хотите выполнить для прикосновения, когда пользователь нажимает URL.
Этого можно достичь с помощью какой-то изумительной работы Handler
, отправив задержанное сообщение для касания и затем удалив эти сообщения касания, если касание было вызвано тем, что пользователь щелкнул URL-адрес.
Вот пример:
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;
}
}
Надеюсь, это поможет.