2011-07-01 29 views
11

Các liên kết nội bộ dường như không hoạt động trong phiên bản Android 3 trong ứng dụng đã xuất bản của tôi. Ứng dụng của tôi nhắm mục tiêu Froyo tại thời điểm này.Các liên kết nội bộ cơ bản không hoạt động trong ứng dụng tổ ong?

Ứng dụng hoạt động tốt trên tấn điện thoại, nhưng Galaxy Tab mới của tôi không thể xử lý các liên kết nội bộ !! Nó có thể xử lý chúng trong một trang html, ví dụ:

<a href="#faq">Go to faq</a> <!-- goes to FAQ link --> 

Chuyển sang thẻ thấp hơn trên cùng một trang:

<a name="faq" id="faq"></a> 

Tuy nhiên từ một tập tin html khác, tức là trang danh mục, liên kết không còn hoạt động trong Honeycomb:

<a href="mainpage.html#faq">FAQ</a> <!-- goes to error page --> 

Ngoài ra, nếu tôi đi đến một liên kết nội bộ, và từ đó theo một liên kết đến một trang khác, sau đó nhấn nút quay lại, (nó là ghi đè để đi đến trang webview trước) bạn nhận được cùng một lỗi tức là:

The webpage at file:///android_asset/folder/mainpage.html#faq might be temporarily down or it may have moved permanently to a new web address 

WTF! Chế độ xem web đã ở trên trang nhưng bạn đã quay lại sau 1 giây và không thể tìm thấy nó. Cũng không phải nó có thể liên kết từ một trang html khác, nhưng tất cả đều hoạt động tốt trong 1.x, 2.x, chỉ không 3.1 (chưa thử 3.0)

LƯU Ý: Tôi đã thấy câu hỏi gần giống hệt này: android_asset not working on Honeycomb? Nhưng không có khoảng trống trong đường dẫn nội dung của tôi.

Tôi đã thử có và không có webclient và đã thử cài đặt DOM và bộ nhớ cache không có kết quả. Dưới đây là ví dụ về những gì tôi hiện có trong oncreate:

 browser = new WebView(this); 
// browser = (WebView) findViewById(R.id.webkit); // tried with XML and without 
    browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
    browser.getSettings().setJavaScriptEnabled(true); 
    browser.getSettings().setPluginsEnabled(true); 
// browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
// browser.getSettings().setUseWideViewPort(true); 
    browser.setBackgroundColor(Color.parseColor("#333333")); 
    browser.setInitialScale(1); 
    browser.getSettings().setBuiltInZoomControls(true); 


    final Activity MyActivity = this; 
    browser.setWebChromeClient(new WebChromeClient() { 

     public void onProgressChanged(WebView view, int progress) { 
      // Make the bar disappear after URL is loaded, and changes 
      // string to Loading... 

      setProgressBarIndeterminateVisibility(true); 

      MyActivity.setTitle(" Loading . . . " + progress + "%"); 
      MyActivity.setProgress(progress * 100); // Make the bar 

      if (progress == 100) { 
       setTitle(" APP TITLE YADA YADA"); 
       setProgressBarIndeterminateVisibility(false); 
      } 
     } 
    }); 
    browser.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
     { 
      // Handle the error 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
      view.loadUrl(url); // note I tried with and without overriding this 
      return true; 
     } 

    }); 
    setContentView(browser); 

    browser.loadUrl("file:///android_asset/folder/page.html"); 
+0

Tôi đang gặp vấn đề tương tự, bạn đã bao giờ tìm thấy một dung dịch ? trang web này dường như nói về một cái gì đó tương tự: http://www.droidnova.com/honeycomb-webview-changes-and-issues,876.html, nhưng nó cung cấp không có giải pháp ... –

+0

Vài tháng sau, tôi vẫn không có giải pháp cho điều này khác hơn là phát hiện 3.x OS và cắt liên kết nội bộ ra khỏi URL. Các chức năng bị cản trở, nhưng nó tránh được lỗi vô căn cứ. – Mischa

+0

Tôi hiện đang làm như sau như một giải pháp gần như minh bạch. Trong onReceivedError, sẽ kích hoạt khi URL không thành công, tôi phát hiện bất kỳ hệ điều hành nào trên gừng và cắt liên kết bên trong để nhận URL trang web cơ bản. Sau đó tôi tải nó trong webview, và làm một giấc ngủ chậm trễ cho 1/2 một giây. Sau đó tôi tải failURL gốc với liên kết nội bộ và thì đấy, bây giờ nó tải. Rõ ràng là trình duyệt đang mắc lỗi kinh điển khi cố gắng truy cập liên kết trước khi nó tồn tại. Nếu có ai có thêm thông tin về lỗi này, tôi là tất cả tai! – Mischa

Trả lời

3

Đây là mã giải pháp của tôi để lỗi trong suốt cho người dùng.
Xác định WebViewClient cho trình duyệt, và bao gồm một cái gì đó như sau cho onReceivedError:

 @Override 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
    { 
     if (failingUrl.contains("#")) { 
      Log.v("LOG", "failing url:"+ failingUrl); 
      final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); 
      if (sdkVersion > Build.VERSION_CODES.GINGERBREAD) { 
       String[] temp; 
       temp = failingUrl.split("#"); 
       view.loadUrl(temp[0]); // load page without internal link 

       try { 
        Thread.sleep(400); 
       } catch (InterruptedException e) { 

        e.printStackTrace(); 
       } 
      } 

      view.loadUrl(failingUrl); // try again 
     } else { 
      view.loadUrl("file:///android_asset/tableofcontents.html"); 
     } 
    } 
    }); 

thủ đoạn này webview đầu tiên tải trang mà không có sự #link, sau đó ngủ .4 của một giây, và sau đó tải lại URL đầy đủ. Tôi đã chọn làm thủ thuật này cho máy tính bảng chỉ bằng sdkVersion. Nếu có bất kỳ lỗi nào khác, tôi tải một trang khác, tableofcontents.html. Điều này hoạt động để khắc phục sự cố trên Tab Galaxy của tôi.

+0

Không chắc chắn tại sao điều này lại bị bỏ phiếu nhưng cảm ơn vì không có gì, cách giải quyết không hoạt động. Nó cũng có thể làm việc với các ký hiệu khác (ví dụ: trái ngược với #) Nếu bạn định bỏ phiếu xuống ít nhất bạn có thể làm là giải thích cho mình! – Mischa

+0

Điều này khắc phục sự cố trên ứng dụng đã xuất bản của chúng tôi. Nó không phải là cần thiết, nhưng bất cứ ai bỏ phiếu nó xuống thực sự cần phải giải thích thay vì chỉ hatin ' – Mischa

+0

Cố gắng nếu nó không hoạt động. Nhưng sau đó tôi không có liên kết nội bộ để bắt đầu. BTW: Cũng có một báo cáo lỗi: http://code.google.com/p/android/issues/detail?id=19293 – Martin

4

Đây là giải pháp tôi sử dụng. Hoạt động tương tự trên tất cả nền tảng Android (được kiểm tra trên tất cả 1.6 đến 4.0.1)

Tải tệp như bình thường, không có điểm neo. Ví dụ:

webview.loadUrl("file:///android_asset/file.html"); 

tải URL mà không có điểm neo (ví dụ file: ///android_asset/file.html), và thêm:

webview.setWebViewClient(new WebViewClient() 
{ 
    public void onPageFinished(WebView view, String url) 
    { 
     if (this.anchor != null) 
     { 
      view.loadUrl("javascript:window.location.hash='" + this.anchor + "'"); 
      this.anchor = null; 
     } 
    } 
}); 

nơi neo là điểm neo bạn muốn nhảy đến.

bạn phải chắc chắn javascript được kích hoạt:

WebSettings webSettings = webview.getSettings(); 
webSettings.setJavaScriptEnabled(true); 

này là dành cho tải các tập tin vào webview. Bây giờ nếu bạn muốn bắt liên kết nội bộ mà bây giờ bị phá vỡ, như đề xuất trong câu trả lời khác, ghi đè lên các phương pháp onReceivedError và chèn làm điều gì đó như:

public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
    { 
     int found = failingUrl.indexOf('#'); 

     if (found > 0) 
     { 
      anchor = failingUrl.substring(found + 1, failingUrl.length()); 
      view.loadUrl(failingUrl.substring(0, found)); 
     } 
    } 
Các vấn đề liên quan