Как определить, был ли loadUrl () вызван ПРЯМО или в результате прикосновения к ссылке? - PullRequest
0 голосов
/ 27 марта 2012

В классе, производном от 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 устанавливает флаг, поэтому возможен ложный сценарий, подобный этому:

  1. Пользователь касается экрана (но не ссылки!))
  2. onTouch устанавливает флаг.
  3. Моя программа напрямую вызывает loadUrl ().
  4. 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)

1 Ответ

1 голос
/ 27 марта 2012

Я не знаю, как правильно делать то, что вы просите, но я могу придумать, как, вероятно, это сработает. В переопределении loadUrl () вы можете запросить свой стек вызовов и посмотреть, какая подпрограмма вызывается у вас. Ваш собеседник будет одним местом для прикосновения, ведущим к вам, и любым другим для того, чтобы быть вызванным программно.

http://www.javapractices.com/topic/TopicAction.do?Id=78 содержит код, показывающий, как определить трассировку стека из метода throwable (который вы бы создали в методе loadUrl ()).

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