如何判断loadUrl()是直接调用还是触摸链接?

时间:2012-03-27 00:01:38

标签: android webview android-webview

在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()实现中,任何触摸设置了标志,因此可能出现这样的错误情况:

  1. 用户触摸屏幕(但不是链接!)
  2. onTouch设置标志。
  3. 我的程序直接调用loadUrl()。
  4. loadUrl()检查标志并认为它是触摸后调用的。
  5. 很明显,上面的onTouch()处理过于简单,不起作用。

    任何想法如何实现实际知道如何在触摸触发的loadUrl()和触摸触发的loadUrl()之间分辨的代码?

    更新:我检查了下面的堆栈跟踪建议,这是通过touch调用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 个答案:

答案 0 :(得分:1)

我不知道你正在做什么的正确方法,但我可以想出一种可能有用的方法。在loadUrl()重写中,您可以查询调用堆栈并查看调用的例程。您的来电者将成为通往您的触摸的一个位置,以及以编程方式调用的任何其他内容。

http://www.javapractices.com/topic/TopicAction.do?Id=78包含显示如何从throwable(您将在loadUrl()方法中创建)中确定堆栈跟踪的代码。