2013-04-16 51 views
1

我正在爲客戶端編寫一個Android應用程序。我一直在使用我自己的框架來創建應用程序。History.pushState和遍歷歷史 - PhoneGap/Android

這個框架在iPhones上沒有問題,但是當我將它應用到Android/Phonegap時,我一直在使用後退按鈕。我的解決方案是調用History對象來創建項目,因爲查看了不同的頁面。這段代碼的要點如下:

 'hook_call': function (name, data, callback, skip_history) { 

      if (typeof callback != 'function') { 
       callback = function() {}; 
      } 

      app.handlers[name].call(this, data, callback); 
      window.app.current_hook = name; 

      // Manage history 
      if(!skip_history) { 
       history.pushState({'page': name, 'data': data}, null, '#'+name); 
      } 

     } 

我onpopstate功能:

// Manage history 
window.onpopstate = function(event) { 
    try { 
     if(window.app.current_hook != event.state.page) 
      window.app.hook_call(event.state.page, event.state.data); 
    } 
    catch(e) {} 
}; 

所以,這增加了正確的項目。但是,如果我去說的三個層次走進了歷史(homelistings - >view_listing),然後按從view_listing我會被帶到listings部分,這是正確的,但任何進一步的印刷機讓我在listings回來,它不會動比這更遠了。

當我看到在日誌中我剛纔解釋的導航步驟後,我看到這些虛假的項目:

04-16 10:22:39.320: D/CordovaWebView(1148): The current URL is: file:///android_asset/www/index.html#listing 
04-16 10:22:39.320: D/CordovaWebView(1148): The URL at item 0 is:file:///android_asset/www/index.html 
04-16 10:22:39.400: D/CordovaWebView(1148): The URL at index: 0is file:///android_asset/www/index.html 
04-16 10:22:39.400: D/CordovaWebView(1148): The URL at index: 1is file:///android_asset/www/index.html#welcome 
04-16 10:22:39.400: D/CordovaWebView(1148): The URL at index: 2is file:///android_asset/www/index.html#listings 
04-16 10:22:39.410: D/CordovaWebView(1148): The URL at index: 3is file:///android_asset/www/index.html#listing 

我要補充一點,才能到不同的頁面,hook_call()被稱爲例如,當列表是點擊或按下按鈕。

這種情況適用於通過應用程序導航的任何其他組合。

有沒有人有這方面的經驗或類似的東西?

+1

你正在使用哪個版本的android和phonegap? – Akhil

+0

我使用科爾多瓦2.4.0,這應該適用於任何支持的Android版本。 – freshnode

+0

你測試過哪種Android版本? Honeycomb使用loadUrl(Cordova使用)和哈希中存在一個錯誤:http://code.google.com/p/android/issues/detail?id=19293也許這跟它有關係?最新的科爾多瓦(2.6)上還存在這個問題嗎?你是否有什麼特別的理由要編寫你自己的歷史模塊,而不是使用內置於科爾多瓦的模塊? – MBillau

回答

3

我相信你的函數應該是這樣的,與skip_history標誌設置:

// Manage history 
window.onpopstate = function(event) { 
    try { 
     if(window.app.current_hook != event.state.page) 
      window.app.hook_call(event.state.page, event.state.data, null, true); 
    } 
    catch(e) {} 
}; 

既然你不想推的歷史,你剛剛趕回到堆棧中。

+0

這工作,謝謝你的位置! – freshnode