Как я могу получить событие onclick на веб-просмотре в Android? - PullRequest
65 голосов
/ 25 февраля 2011

Я хочу знать, когда пользователь нажимает на веб-просмотр, но не на гиперссылку.На этом клике я хочу показать / скрыть вид моей деятельности, которая содержит веб-просмотр.Любое предложение?

Ответы [ 8 ]

81 голосов
/ 26 февраля 2011

Я посмотрел на это и обнаружил, что 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;
}
}

Надеюсь, это поможет.

33 голосов
/ 03 февраля 2014

Вы можете реализовать 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;
        }
    });
10 голосов
/ 29 апреля 2016

Решение Хамидрезы почти сработало для меня.

Я заметил из экспериментов, что простое нажатие обычно имеет 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;
    }
7 голосов
/ 27 марта 2017

Событие при нажатии. При работе в onTouch WebView работает следующим образом:

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;                 
  }                       
});
4 голосов
/ 03 апреля 2014

Я думаю, вы также можете использовать состояние MotionEvent.ACTION_UP, например:

@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;
}
3 голосов
/ 19 мая 2015

Это работает для меня

webView.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                // Do what you want
                                return false;
                            }
                        });
0 голосов
/ 13 февраля 2016

Это потому, что он привязан к веб-представлению, а не к кнопке. У меня была такая же проблема после реализации. Кнопка не имела никакого влияния, но страница в веб-представлении не влияла.

0 голосов
/ 27 июня 2014

WebViewClient.shouldOverrideUrlLoading может быть полезным.У нас аналогичное требование в одном из наших приложений.Еще не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...