code

android의 webview에서 onclick 이벤트를 어떻게 얻을 수 있습니까?

codestyles 2020. 11. 17. 08:07
반응형

android의 webview에서 onclick 이벤트를 어떻게 얻을 수 있습니까?


사용자가 하이퍼 링크가 아닌 웹보기를 클릭 할 때 알고 싶습니다. 클릭하면 웹보기를 보유한 내 활동의보기를 표시하거나 숨기고 싶습니다. 어떠한 제안?


나는 이것을 살펴 보았고 a 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;
}
}


도움이 되었기를 바랍니다.


OnTouchListener를 통해 OnClickListener를 구현할 수 있습니다.

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;
        }
    });

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;
    }

On Click 이벤트 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.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;
}

이것은 나를 위해 작동합니다

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

WebViewClient.shouldOverrideUrlLoading도움이 될 수 있습니다. 우리 앱 중 하나에 유사한 요구 사항이 있습니다. 아직 시도하지 않았습니다.


Thats because its tied to the web view not the button. I had the same problem after implementing. The button had no affect but the page in the web view did.

참고URL : https://stackoverflow.com/questions/5116909/how-can-i-get-onclick-event-on-webview-in-android

반응형