在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()实现中,任何触摸设置了标志,因此可能出现这样的错误情况:
很明显,上面的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)
答案 0 :(得分:1)
我不知道你正在做什么的正确方法,但我可以想出一种可能有用的方法。在loadUrl()重写中,您可以查询调用堆栈并查看调用的例程。您的来电者将成为通往您的触摸的一个位置,以及以编程方式调用的任何其他内容。
http://www.javapractices.com/topic/TopicAction.do?Id=78包含显示如何从throwable(您将在loadUrl()方法中创建)中确定堆栈跟踪的代码。