2015-06-06 54 views
1

我不知道我是否誤解了jQueryMobile,或者我看到Chromium Webview錯誤。我有一個使用webview顯示jQueryMobile內容的Android應用程序。當用戶在頁面的DIV內導航時,在onPageFinished()中,我調用getTitle()來檢索Html頁面標題。有時,getTitle()返回頁面的URL而不是頁面標題。Android 4.4.4 onPageFinished()中的WebView getTitle()返回頁面URL?

我不明白爲什麼。

下面是Android活動的簡化版本,表明了同樣的問題:

public class WebViewTitleTestActivity extends Activity { 
    private WebView mWebView; 
    private TextView mTitleTextView; 
    private final String TAG = "WebViewTitleTest"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mWebView = (WebView) findViewById(R.id.webView); 
     mTitleTextView = (TextView) findViewById(R.id.title); 

     mWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       String titleText = view.getTitle(); 
       Log.i(TAG, String.format("in onPageFinished. titleText = %s", titleText)); 
       mTitleTextView.setText(String.format("Title: %s", titleText)); 
      } 
     }); 

     final WebSettings browserSettings = mWebView.getSettings(); 
     browserSettings.setJavaScriptEnabled(true); 
     mWebView.loadUrl("file:///android_asset/jqmTest.html"); 
    } 
} 

下面是一些示例HTML:

<html lang="en" class="ui-mobile"> 
<head> 
    <title>Send a message</title> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css"/> 
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> 
    <script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> 
</head> 

<div history="false" data-role="page" data-cache="false" id="signal" data-url="signal" tabindex="0" 
    class="ui-page ui-body-c ui-page-active" style="min-height: 486px;"> 
    <div data-role="content" class="content ui-content" role="main"> 
     <h2>Send a message <a href="#help" class="information ui-link" id="signalInfoBox">(help)</a></h2> 

     <div class="text"> 
      <p>We'll send a message to your destination.</p> 
     </div> 
    </div> 
    <div id="divAction" class="response"> 
     <div class="buttons"> 
      <div class="yes-single"> 
       <a href="#" id="sendsignal" data-role="button" data-theme="c" 
        class="ui-btn ui-btn-up-c ui-btn-corner-all ui-shadow"> 
        <span class="ui-btn-inner ui-btn-corner-all"><span class="ui-btn-text">Send</span></span></a> 
      </div> 
     </div> 
    </div> 
</div> 

<div data-role="page" class="ui-page ui-body-a ui-body-c" id="help" data-url="help" data-external-page="false" 
    tabindex="0" style="min-height: 526px;"> 
    <div data-role="content" class="content ui-content" role="main"> 
     <h2>More Info</h2> 
     <div class="text"> 
      <p>You can send a message to your selected destination. Just click Send.</p> 
     </div> 
    </div> 
    <div class="response"> 
     <div class="buttons"> 
      <a id="btnCancel" href="#signal" 
       class="cancel-button ui-btn ui-btn-corner-all ui-shadow ui-btn-up-c ui-btn-up-undefined" 
       style="padding: 10px 0;" data-role="button">Close</a> 
     </div> 
    </div> 
</div> 

</html> 

當用戶點擊(幫助)鏈接,導航到#help,顯示幫助div,getTitle()檢索的標題是正確的。當用戶點擊關閉按鈕時,在onPageFinished()中,對view.getTitle()的調用將返回頁面URL而不是Html標題。

爲什麼veiw.getTitle()返回頁面url?

我在運行Android 4.4.4的摩托羅拉Moto E上測試這個。目標SDK是API 19.這似乎不會在Android 4.4.2或5.x上發生。這是4.4.4的一個已知問題嗎?

+0

第一次加載頁面時先生getTitle()是否正確? – Elltz

+0

是的,第一次加載頁面(並顯示id =「signal」div)標題是正確的。點擊(幫助)鏈接,標題仍然正確。然後點擊關閉,然後標題是錯誤的。此外,似乎onPageFinished()被稱爲每次頁面加載兩次。這是jQueryMobile的副作用嗎? –

+1

老實說,我不能告訴,但從webview文檔說getTitle是頁面的標題,直到onTitleReceived被調用,所以即時猜你拉標題一次,並保存在某處,因爲它不是之後,該接口被稱爲,老實說,這些都是猜測, – Elltz

回答

0

由於Android Chromium WebView錯誤(https://code.google.com/p/chromium/issues/detail?id=481570),我無法在Android版本4.4及更高版本的setWebChromeClient()中使用onReceivedTitle()回調。相反,我使用setWebViewClient()的onPageFinished()回調創建瞭解決方法。然而,這在Android 4.4.4中似乎有一個錯誤,有時在調用view.getTitle()時返回頁面URL。

在頁面的DIV之間jQueryMobile導航,在下面有時會返回頁面的URL,而不是HTML標題

public void onPageFinished(WebView view, String url) { 
    super.onPageFinished(view, url); 
    String titleText = view.getTitle(); 
    } 

作爲一種變通方法,我把像調用view.getTitle()如下:

@Override 
    public void onPageFinished(WebView view, String url) { 
    super.onPageFinished(view, url); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 

     String javascript = "(function() { " + 
      "var titles = document.getElementsByTagName(\"title\");" + 
      "if (titles == null || titles.length != 1) return \"\";" + 
      "return titles[0].textContent; " + 
      "})();"; 

     browser.evaluateJavascript(javascript, new ValueCallback<String>() { 
      @Override 
      public void onReceiveValue(String s) { 
      String htmlTitleString = s.replace("\"", ""); 
      if (htmlTitleString != null && htmlTitleString.length() > 0) { 
       title.setText(htmlTitleString); 
      } 
      } 
     }); 
    } else { 
     String titleText = view.getTitle(); 
     if (titleText != null && titleText.length() > 0) { 
      title.setText(titleText); 
     } 
    } 
    } 

這將從KitKat及更高版本的WebView DOM中提取HTML標題。目前爲止這似乎是可靠的。我覺得很難相信這是必要的,而且沒有其他人在這些問題上絆腳石。我不覺得我們正在做一些不尋常的事情。

相關問題