2012-03-27 27 views
0

在網頁視圖派生類我重寫使用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()實現,任何觸摸設置標誌,因此像這樣的假情況是可能的:

  1. 用戶觸摸屏幕(但不是鏈接!)
  2. onTouch設置標誌。
  3. 我的程序直接調用loadUrl()。
  4. 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) 

回答

1

我不知道正確的方式做你問什麼,但我能想到的這種方式可能會起作用。在你的loadUrl()覆蓋中,你可以查詢你的調用堆棧並查看調用到你的例程。您的來電者將成爲通向您的觸摸位置,以及以編程方式被調用的其他位置。

http://www.javapractices.com/topic/TopicAction.do?Id=78包含代碼,顯示如何從throwable(您將在loadUrl()方法中創建)確定堆棧跟蹤。

+0

這是一個奇妙的想法。這是否認爲觸摸的「堆棧距離」總是相同?當然值得嘗試(除非有更直接的WebView特定的現有機制)。 – uTubeFan 2012-03-27 01:35:51

+1

我不認爲堆棧路徑會改變,因爲它是直接或間接調用loadUrl()的同一例程。風險在於不同版本的Android框架具有不同的呼叫簽名 - 風險較低,但如果您需要廣泛的覆蓋範圍,則值得使用各種版本的仿真器進行研究。 – mah 2012-03-27 02:00:27

+0

看到我上面的更新。'uiOverrideUrlLoading'看起來很有希望,但現在你指出了不同Android版本的可能性,這看起來很可怕。有那麼多的Android版本和風格在那裏... – uTubeFan 2012-03-27 02:20:05

相關問題