Подтвердить что ты не робот

Как я могу получить onclick событие в веб-браузере в Android?

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

4b9b3361

Ответ 1

Я взглянул на это, и я обнаружил, что WebView, похоже, не отправляет события click в 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;
}
}


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

Ответ 2

Вы можете реализовать 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;
        }
    });

Ответ 3

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

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

Ответ 4

Я думаю, вы также можете использовать состояние 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;
}

Ответ 5

On Click event В 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;                 
  }                       
});

Ответ 6

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

webView.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                // Do what you want
                                return false;
                            }
                        });

Ответ 7

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

Ответ 8

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