Как я могу получить onclick событие на webview в android?
Я хочу знать, когда пользователь нажимает на WebView, но не гиперссылку. На этом клике я хочу показать / скрыть представление моей деятельности, которая содержит веб-представление. Есть предложения?
8 ответов:
Я взглянул на это, и я обнаружил, что a
WebView
не похоже, чтобы отправить события click для элементаOnClickListener
. Если кто-то там может доказать, что я ошибаюсь или сказать мне, почему тогда мне было бы интересно услышать это.что я нашел это
WebView
отправит события касания вOnTouchListener
. У него есть свойonTouchEvent
метод, но я только когда-либо, казалось, сделатьMotionEvent.ACTION_MOVE
используя этот метод.так что, учитывая, что мы можем получить события на зарегистрированном прослушивателе событий touch, единственная проблема в том, что остается, как обойти любое действие, которое вы хотите выполнить для прикосновения, когда пользователь нажимает 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; } }
Надеюсь, это поможет.
вы можете реализовать OnClickListener через 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; } });
решение Хамидрезы почти работал для меня.
Я заметил, что из экспериментов, что простой кран обычно имеет 2-5 ход действия событий. Проверка времени между действием вниз и вверх была проще и вела себя больше так, как я ожидал.
private class CheckForClickTouchLister implements View.OnTouchListener { private final static long MAX_TOUCH_DURATION = 100; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: m_DownTime = event.getEventTime(); //init time break; case MotionEvent.ACTION_UP: if(event.getEventTime() - m_DownTime <= MAX_TOUCH_DURATION) //On click action break; default: break; //No-Op } return false; }
on Click event On webView работает в onTouch следующим образом:
imagewebViewNewsChart.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction()==MotionEvent.ACTION_MOVE){ return false; } if (event.getAction()==MotionEvent.ACTION_UP){ startActivity(new Intent(this,Example.class)); } return false; } });
Я думаю, что вы также можете использовать MotionEvent.Состояние выполняется, например:
@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; }
это работает для меня
webView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Do what you want return false; } });