在網頁視圖派生類我重寫使用loadURL():如何判斷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()檢查標誌並認爲它是作爲觸摸的結果被調用的。
所以很明顯,上面的onTouch()處理過於簡單並且不起作用。
任何想法如何實現代碼,實際上知道如何分辨觸摸觸發的loadUrl()和觸摸觸發的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)
這是一個奇妙的想法。這是否認爲觸摸的「堆棧距離」總是相同?當然值得嘗試(除非有更直接的WebView特定的現有機制)。 – uTubeFan 2012-03-27 01:35:51
我不認爲堆棧路徑會改變,因爲它是直接或間接調用loadUrl()的同一例程。風險在於不同版本的Android框架具有不同的呼叫簽名 - 風險較低,但如果您需要廣泛的覆蓋範圍,則值得使用各種版本的仿真器進行研究。 – mah 2012-03-27 02:00:27
看到我上面的更新。'uiOverrideUrlLoading'看起來很有希望,但現在你指出了不同Android版本的可能性,這看起來很可怕。有那麼多的Android版本和風格在那裏... – uTubeFan 2012-03-27 02:20:05