web-dev-qa-db-ja.com

Android Webviewアンカーリンク(ジャンプリンク)が機能しない

Android loadDataWithBaseURL()メソッドを使用してHTML文字列をロードしているアプリにWebViewがあります。問題は、ローカルアンカーリンク(<a href="#link">...)が正しく機能していません。リンクをクリックすると強調表示されますが、対応するアンカーまでスクロールしません。

これは、WebViewのloadUrl()メソッドを使用してアンカーリンクを含むページをロードする場合にも機能しません。ただし、ブラウザに同じURLをロードすると、アンカーリンクは機能します。

これらをWebViewで機能させるために必要な特別な処理はありますか?

API v4(1.6)を使用しています。

コードにはそれほど多くはありませんが、ここで私が取り組んできたいくつかのテストコードの関連部分を示します。

WebView detailBody = (WebView) findViewById(R.id.article_detail_body);
String s = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!";
detailBody.loadDataWithBaseURL(API.HomeURL(this), s, "text/html", "utf-8", "");
26
Joel

問題は、ScrollView内にWebViewがあったことです。このように構成すると、WebViewはアンカーリンクにスクロールできません。レイアウトをリファクタリングしてScrollViewを削除した後、アンカーリンクは正しく機能します。

23
Joel

Android Webviewアンカーリンク(ジャンプリンク)が機能しない

True、WebViewアンカーリンク、またはURLへの#LINK拡張を介して開始されたジャンプリンクは、WebViewがScrollView(*)内にある場合は機能しません。

それでも、私や明らかに他の人にとっての問題は、#LINKがhrefのタッチから起動されたときに機能するが、URL経由で起動されたときに無視されることです。その他の症状には、セッションで初めてリンクに移動したり、htmlファイルの下部に移動したりすることが含まれます。

解決策は、少し遅れてURLをロードすることです。

次に例を示します。

私のHTMLはアセットに保存されています:res/assets/help.html

このようなアンカーで:

<a name="helplinkcontacts"/>

そして、このようにロードされます:

final String baseUrl = "file:///Android_asset/help.html#helplinkcontacts";
final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text);
helpTextView.loadUrl(baseUrl); // Ignores Anchor!!

私はこのようなタイマーを追加しました:

final String baseUrl = "file:///Android_asset/help.html#helplinkcontacts";
final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        helpTextView.loadUrl(baseUrl);
    }
}, 400);

注:100msなどの短い遅延では、リンクに移動できませんでした。

(*)一部のHTMLをサポートし、ScrollViewを必要とするSpannableテキストを表示するTextViewから始めたため、多くの人がScrollView内にWebViewを持っています。とにかく、TextViewをWebViewに変換したらすぐにScrollViewを削除します。

15
David Manpearl

私の解決策は、 この回答を確認する

public class MainActivity extends Activity { 
    WebView myWebView; 
    public static boolean flag = false; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        myWebView = new WebView(this); 
        myWebView.getSettings().setJavaScriptEnabled(true); 
        myWebView.loadUrl("file:///Android_asset/chapters.html"); 
        setContentView(myWebView); 
        myWebView.setWebViewClient(new WebViewClient() { 
            public void onPageFinished(WebView view, String url) { 
                if (url.contains("#") && flag == false) { 
                    myWebView.loadUrl(url); 
                    flag = true; 
                } else { 
                    flag = false; 
                } 
            } 

        }); 
    } 
} 
6
MKJParekh

同様の問題がありました。 HTMLのアンカータグにジャンプするものはありません。 ScrollView内にWebViewがありませんでした。代わりに、loadDataWithBaseURLに渡したベースURLにコロン( ':')が含まれていないことが問題でした。 baseUrlにはいくつかのテキスト、次にコロン、さらに「app:htmlPage24」などのテキストを含める必要があると思います。

したがって、文字列HTML_24のデータをロードするためだけに、ここに私のWebViewへの最初の呼び出しがあります。

wv.loadDataWithBaseURL("app:htmlPage24", HTML_24, "text/html", "utf-8", null);

次に、タップしたリスト項目に応じて、画面上のセクションにジャンプするリストがあります。

sectionsLV.setOnItemClickListener(new OnItemClickListener()
{
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
    {
        wv.loadUrl("app:htmlPage24#section" + arg2);
    }
});

HTML_24は次のようなものです。

<html>
...
<a name="section1"/>

...
<a name="section2"/>

...
<a name="section3"/>

...
</html>
2
ubzack

Android 4.0のWebViewは、リンクが含まれているURLを開くことができません。例: "file:///Android_asset/help.html#helplinkcontacts"

ここに私がそれを回避した方法があります

WebView wv = (WebView) nagDialog.findViewById(R.id.wv);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new MyWebViewClient(link));
wv.loadUrl("file:///Android_asset/help.html");

そして、カスタムWebViewClientクラスを定義します

class MyWebViewClient extends WebViewClient {
    private String link;

    public MyWebViewClient(String link) {
        this.link = link;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        if (!"".equals(link) && link != null)
            view.loadUrl("javascript:location.hash = '#" + link + "';");
    }
}
2
Peter McKeown

私も同じ問題に直面していました。アンカーリンクが任意の位置にジャンプしていました。ロード時にwebviewを非表示にしないでください。

Invisibleの代わりにgoneを使用してください。

この変更により私の問題が修正されました。

2
Ujjwal Goyal
try this

String myTemplate = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!";

myWebView.loadDataWithBaseURL(null, myTemplate, "text/html", "utf-8", null);

「テスト!」という言葉動作するためには、画面の外にいる必要があります。

0
Jorgesys