2011-07-01 16 views
11

İç bağlantılar, yayınlanan uygulamamdaki Android sürüm 3'te çalışmıyor gibi görünüyor. Uygulamam bu noktada Froyo'yu hedefliyor.Temel iç bağlantılar petek uygulamasında çalışmaz mı?

Uygulama, tonlarca telefonda iyi çalışıyor ancak yeni Galaxy Tab'ım dahili bağlantıları kaldıramıyor! Bu, bir html sayfası içinde bunları işleyebilir yani: dizin sayfasında yani bağlantı yok bir başka html dosyasından Ancak

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

:

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

aynı sayfada alt etikete Goes

artık Honeycomb çalışır: Ben bir iç bağlantı giderseniz, Ayrıca

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

ve oradan başka bir sayfaya bir bağlantıyı izlemek, daha sonra geri düğmesine basın, siz (bir önceki webview sayfasına gitmek için geçersiz sayılmıştır) aynı hatayı al:

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! Web sayfası sadece sayfadaydı, ama 1 saniye sonra geri döndün ve onu bulamıyorsunuz. Ne de başka bir html sayfası bağlantısını, ama hepsi değil sadece 3.1 (denemedim 3.0), 1.x, 2.x içinde

NOT çalışıyor olabilir: gördüğüm bu hemen hemen aynı soruyu: android_asset not working on Honeycomb? Ama varlık yolumda boşluk yok.

Webclient ile ve denemeyi denedim ve DOM ve önbellek ayarlarını boşuna denedim. İşte şu anda OnCreate ne var bir örnektir: Hata kullanıcıya şeffaf olacak şekilde

 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

Ben aynı sorunu yaşıyorum: Şimdi, diğer cevap önerildiği üzere şimdi, kırık iç bağlantıları yakalamak onReceivedError yöntemini geçersiz ve eklemek istiyorum gibi bir şey yapmak çözüm ? Bu site benzer bir şey hakkında konuşmak gibi görünüyor: http://www.droidnova.com/honeycomb-webview-changes-and-issues,876.html, ama hiçbir çözüm sunmuyor ... –

+0

Aylar sonra hala çözümüm yok Bunun için 3.x OS'yi tespit etmek ve iç bağlantıyı URL'den kesmek dışında. İşlevsellik engelleniyor, ancak yanlışlıktan kaçınıyor. – Mischa

+0

Şu an neredeyse şeffaf bir çözüm olarak yapıyorum. URL başarısız olduğunda tetiklenen onReceivedError'da, temel web sayfası URL'sini almak için zencefilli kurabiye üzerinde herhangi bir os algılayabilir ve iç bağlantıyı keserim. Bunu web sayfasından yüklerim ve 1/2 saniyelik bir uyku gecikmesi yaparım. Daha sonra orijinal failURL'i dahili link ve voila ile yükledim, şimdi yükler. Görünüşe göre tarayıcı, var olan bağlantıya erişmeye çalışmaktan klasik hata yapıyor. Bu böcek üzerinde herhangi bir başkası varsa, ben tüm kulaklarım! – Mischa

cevap

3

İşte benim geçici çözüm kodudur.

 @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"); 
     } 
    } 
    }); 

Bu hileler webview ilk önce bir saniyenin .4 uyku, #link olmadan sayfayı yüklemek ve sonra için:
tarayıcı için WebViewClient tanımlayın ve onReceivedError için aşağıdaki gibi bir şey içerir URL’yi tekrar yükleyin. Sadece sdkVersion tarafından tablet için bu hile yapmak için seçtiniz. Başka bir hata varsa, başka bir sayfa yüklüyorum tableofcontents.html. Bu, Galaxy Tab'ımdaki sorunu düzeltmek için çalışıyor.

+0

Bunun neden oy verildiğinden emin değil, hiçbir şey için teşekkürler, geçici çözüm işe yarıyor. Aynı zamanda diğer sembollerle de çalışabilir (örneğin: # 'nın tersi) Eğer oy verecekseniz en azından bunu kendiniz açıklayabilirsiniz! – Mischa

+0

Bu, yayınlanan uygulamamızdaki sorunu giderir. Gerekli olmamalı, ancak oyu kullanan kişi gerçekten sadece – Mischa

+0

numaralı hat yerine açıklamak zorundadır, ancak işe yaramadı. Ama sonra başlamak için hiçbir iç bağlantım yoktu. BTW: Bir hata raporu da var: http://code.google.com/p/android/issues/detail?id=19293 – Martin

4

Kullandığım çözüm. Tüm Android platformlarında da aynı şekilde çalışır (tüm 1.6'dan 4.0.1'e kadar test edilmiştir)

Dosyayı, normal olarak, bağlantı noktası olmaksızın yükleyin. Ör: sabitleme noktasına olmadan

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

Yük URL (örneğin dosya: ///android_asset/file.html) ve ekleyin:

çapa atlamak istediğiniz çapa noktasıdır
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; 
     } 
    } 
}); 

için.

Emin JavaScript etkinse yapmak zorunda:

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

Bu Web görünümündeki içine dosyası yüklenirken içindir.Hiç buldun,

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)); 
     } 
    } 
İlgili konular