Android 如何判断loadUrl()是直接调用的还是由于接触链接而调用的?
在WebView派生类中,I重写loadUrl(): 在这个被重写的loadUrl()中,我想知道它是由于用户触摸链接(在同一个WebView中)而被调用的,还是实际上在我的程序中的某个地方被直接调用的(或者是由我直接调用的,或者是由于某些Javascript处理等而间接调用的) 我最初想通过在Android 如何判断loadUrl()是直接调用的还是由于接触链接而调用的?,android,webview,android-webview,Android,Webview,Android Webview,在WebView派生类中,I重写loadUrl(): 在这个被重写的loadUrl()中,我想知道它是由于用户触摸链接(在同一个WebView中)而被调用的,还是实际上在我的程序中的某个地方被直接调用的(或者是由我直接调用的,或者是由于某些Javascript处理等而间接调用的) 我最初想通过在OnTouchListener()中设置一个标志来区分两者: 并在检查其值后在loadUrl()中重置它 这个“解决方案”的问题在于,在前面提到的onTouch()实现中,任何触摸都会设置标志,因此可能出
OnTouchListener()
中设置一个标志来区分两者:
并在检查其值后在loadUrl()中重置它
这个“解决方案”的问题在于,在前面提到的onTouch()实现中,任何触摸都会设置标志,因此可能出现类似这样的错误情况:
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)
我不确定我是否能在那里识别出一个明确的触摸事件,但以下内容看起来很有希望(它们不会出现在非触摸加载URL上):
我不知道有什么合适的方法来满足你的要求,但我能想出一种可能有效的方法。在loadUrl()覆盖中,您可以查询调用堆栈并查看调用的例程。您的来电者将是指向您的触摸的一个位置,以及通过编程调用的任何其他位置
包含显示如何从可丢弃文件(您将在loadUrl()方法中创建)确定堆栈跟踪的代码。这是一个好主意。这是否假设触摸的“堆叠距离”始终相同?当然值得一试(除非有更直接的WebView特定的现有机制)。我认为堆栈路径不会改变,因为它是直接或间接调用loadUrl()的同一个例程。风险在于不同版本的Android框架具有不同的调用特征——风险较低,但如果您需要广泛的覆盖范围,可以使用不同版本的模拟器进行研究。请参阅上面我的更新<代码>uiOverrideUrlLoading看起来很有希望,但是现在你指出了不同Android版本的可能性,这看起来很可怕。有那么多的Android版本和口味。。。
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// set flag !!!
}
return false;
}
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)
android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)