2011-07-01 18 views
11

公開されているアプリのAndroidバージョン3では内部リンクが動作していないようです。私のアプリはこの時点でFroyoをターゲットにしています。ハニカムアプリで基本的な内部リンクが機能しないのですか?

アプリは大量の電話機で正常に動作しますが、新しいギャラクシータブでは内部リンクを処理できません。これは、htmlページ、すなわち内でそれらを処理することができます:

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

は、同じページに下のタグに移動します:

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

しかし、別のHTMLファイルから、インデックスページ、リンクがない。すなわち長いハニカムで動作します。私は内部リンクに行けば、また

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

をし、そこから別のページへのリンクをたどって、その後、バックボタンを押し、あなたが(以前のWebViewのページに移動するにはオーバーライドされます)同じエラーが発生する:

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! webviewはちょうどそのページにありましたが、1秒後にヒットし、それを見つけることができません。また、それは別のHTMLページからリンクしますが、それはすべての(3.0を試していない)の1.x、2.xの、だけではない3.1で

NOTEを正常に動作することができます:私はこのほぼ同じ質問見てきました: android_asset not working on Honeycomb? をしかし、私の資産経路にはスペースがありません。

私はwebclientを使用して試してみましたが、DOMとキャッシュの設定を無駄に試しました。ここで私は、現在の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

あなたが見つけた私は、同じ問題を抱えています解決策?このサイトは類似のものについて話しているようです:http://www.droidnova.com/honeycomb-webview-changes-and-issues,876.htmlしかし、それは解決策を提供しません... –

+0

数ヶ月後、私はまだ解決策がありませんこれは、3.x OSを検出し、URLから内部リンクを切断する以外の方法です。機能は妨げられますが、根本的なエラーを回避します。 – Mischa

+0

私は現在、ほぼ透明な回避策として次のことを行っています。 URLが失敗したときに起動するonReceivedErrorでは、gingerbreadの上にあるosを検出し、内部リンクを切断して基本WebページURLを取得します。私はそれをwebviewにロードし、1/2秒間スリープの遅延を行います。私はそれから内部のリンクとvoilaと元のfailedURLを読み込みます、それは今ロードします。明らかに、ブラウザはリンクが存在する前にそのリンクにアクセスしようとする古典的な間違いを犯しているようです。誰かがこのバグについてもっと知っているならば、私はすべて耳です! – Mischa

答えて

3

ここに私の問題を回避するコードは、そのバグがユーザーに対して透過的です。

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

このトリックをWebViewのは、最初の2番目の0.4のために眠る、#linkせずにページをロードし、その後する:
は、ブラウザのためWebViewClientを定義し、onReceivedErrorのために、以下のようなものが含まれます完全なURLを再度読み込みます。私はsdkVersionだけで錠剤のこのトリックをすることにしました。他のエラーがある場合は、別のページ、tableofcontents.htmlを読み込みます。これは私のギャラクシータブの問題を解決するために動作します。

+0

これがなぜ投票されたのかわかりませんが、何もありがたいことですが、回避策が機能します。それは他のシンボルとも使えます(#とは対照的に?)あなたがそれを投票するつもりなら、あなた自身が説明することができます。 – Mischa

+0

これにより、公開されたアプリの問題が修正されます。それは必要ではないはずですが、投票した人は本当にハットの代わりに説明する必要があります。 – Mischa

+0

それがうまくいくかどうか試してみましょう。しかし、私は内部のリンクがありませんでした。 BTW:バグレポートもあります:http://code.google.com/p/android/issues/detail?id=19293 – Martin

4

ここで私が使用している解決策です。すべてのAndroidプラットフォームで同じように動作します(1.6から4.0.1すべてでテスト済み)

アンカーポイントなしで通常どおりファイルを読み込みます。例:

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

アンカーポイント(例えばファイル:///android_asset/file.html)せずにURLをロードし、そして追加:

アンカーは、あなたがジャンプしたいアンカーポイントである
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; 
     } 
    } 
}); 

に。

よろしいジャバスクリプトが有効にされていることを確認する必要があります。

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

これはWebViewのにファイルをロードするためです。あなたは、他の回答で提案されているように、今、壊れている内部リンクをキャッチonReceivedErrorメソッドをオーバーライドし、ような何かを挿入したい場合は は今:

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)); 
     } 
    } 
関連する問題