В классе, производном от WebView, я переопределяю loadUrl ():
@Override
public void loadUrl(String url) {
super.loadUrl(url);
}
Внутри этого переопределенного loadUrl () я хочу знать, был ли он вызван в результате того, что пользователь коснулся ссылки (внутритот же WebView), или фактически был вызван непосредственно где-то в моей программе (либо непосредственно мной, либо косвенно в результате некоторой обработки Javascript и т. д.).
Сначала я думал о различении между ними путем установкифлаг в OnTouchListener()
:
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// set flag !!!
}
return false;
}
и сброс его в loadUrl (), после проверки его значения.
Проблема с этим «решением» заключается вчто в вышеупомянутой реализации onTouch () флаг any устанавливает флаг, поэтому возможен ложный сценарий, подобный этому:
- Пользователь касается экрана (но не ссылки!))
- onTouch устанавливает флаг.
- Моя программа напрямую вызывает loadUrl ().
- loadUrl () проверяет флаг и считает, что он был вызван в результате касания.
Так что, очевидно,описанная выше обработка onTouch () слишком упрощена и не работает.
Любая идея, как реализовать код, который на самом деле знает, как различить loadUrl (), запускаемую касанием, и non -loadUrl ()?
Обновление: Я проверил приведенное ниже предложение трассировки стека, и это трассировка стека в loadUrl (), когда он вызывается через прикосновение:
com.utubefan.MyWebView.loadUrl(MyWebView.java:365)
com.utubefan.MyWebViewClient.shouldOverrideUrlLoading(MyWebViewClient.java:123)
android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:4627)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:521)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
dalvik.system.NativeStart.main(Native Method)
Я не уверен, что смогу идентифицировать явное событие касания там, но следующее выглядит многообещающе (они не отображаются в не-сенсорном loadUrl):
android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)