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
'code' 카테고리의 다른 글
jQuery UI 자동 완성 위젯 검색 구성 (0) | 2020.11.17 |
---|---|
반사를 통해 개체의 필드를 가져 오는 방법은 무엇입니까? (0) | 2020.11.17 |
JAX-RS의 필수 @QueryParam (및 부재시 수행 할 작업) (0) | 2020.11.17 |
동일한 스크립트로 제출시 HTML 양식에서 PHP로 이메일 보내기 (0) | 2020.11.17 |
Map [string] int를 값으로 정렬하는 방법은 무엇입니까? (0) | 2020.11.17 |