0

WebViewアンカー タグをrel=externalAndroid ブラウザで開く必要がありますが、他のすべてのリンクはWebView.

したがって、WebViewユーザーがマークアップが次のようなリンクをタップすると、コンテンツがロードされます。

<a href="http://example.com/">Whatever</a>

ただし、ユーザーが次のようなマークアップのリンクをタップすると、Android ブラウザーにコンテンツが読み込まれます。

<a href="http://example.com/" rel="external">Whatever</a>

コード内の関連コード (コメントで識別される疑似コードのビット) は次のWebViewClientとおりです。

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (! rel=external) {   //  <-- That condition...how do I do that?
        view.loadUrl(url);
        return false;
    } else {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
        return true;
    }

rel=external属性/値があるかどうかを判断する最良の方法は、属性がaddJavascriptInterface()あるかどうかと値が何であるかを JavaScript に何らかの方法で使用して Java に通知さrelせることでしょうか?

それとももっと良い方法がありますか?

(内部として処理する必要があり、事前に知ることも、その場で簡単に判断することもできない任意の数のドメインがあるため、URL のドメインをチェックしないソリューションを探しています。)

4

3 に答える 3

2

既存の URL を変更したくない場合は、元の提案のバリエーションがおそらく最適だと思います。

addJavaScriptInterface外部 URL の読み込みを処理するクラスを追加するために使用します。内部クラスは次のようになります。

public class JavaScriptInterface {
    public void viewExternalUrl(String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

そしてもちろんそれを追加します:

webView.addJavascriptInterface(new JavaScriptInterface(), "Android");

JavaScript を挿入して、loadUrl. WebViewClientカスタムを作成してオーバーライドすることで、ページ読み込みの終了を検出できますonPageFinished

webView.setWebViewClient(new WebViewClient() {
    private static final String sJs = "javascript:" +
        Uri.encode("$('a[@rel$='external']').click(function(){ Android.viewExternalUrl($(this).attr('href')); });");

    @Override
    public void onPageFinished(WebView view, String url) {
        webView.loadUrl(sJs);
    }
}

このコードをテストしたことはありませんが、ページに JQuery がロードされていれば、動作するはずです。そうでない場合は、JavaScript を使用せずに DOM を操作する JavaScript を考え出すか、loadUrl を使用して、JavaScript をロードする前に最初に JQuery を手動でロードすることができます。

このアプローチは、の使用を完全に放棄することに注意してくださいshouldOverrideUrlLoading

于 2012-01-20T02:50:19.260 に答える
1

サーバー側のコンテンツを管理している場合は、Theoの提案に従ってください。ページは標準のブラウザにもロードする必要があることを示しているため、カスタムスキームを使用せずに、rel=externalリンク/リダイレクト先の実際のURLの一部を作成します。

urlそうすることで、パラメータを簡単に解析し、shouldOverrideUrlLoading(WebView view, String url)上記のキーと値のペアを確認できます。これを解析して、値が一致するかどうかを確認するためにUri使用することをお勧めします。もしそうなら、インテントを発射します。getQueryParameter(key)relexternal

次のようになります。

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Uri uri = Uri.parse(url);
    String relValue = uri.getQueryParameter("rel");    
    if (relValue != null && !relValue.equals("external")) {
        view.loadUrl(url);
        return false;
    }
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(uri);
    startActivity(intent);
    return true;
}

補足:「if」のメソッドからすでに戻っているため、「else」を宣言する必要はありません。

ユーザーがWebViewを使用して任意のサイトにアクセスでき、他のサイトが同じキーと値のペアを目的に適用することに偏執的である場合は、URLが「自分の」ドメインにあるかどうかを判断する別のチェックを簡単に追加できます。

于 2012-01-14T11:31:30.500 に答える
1

私の提案は、外部 URL を指定する別の方法を使用することです...その情報を URL に埋め込むため、shouldOverrideUrlLoading関数と互換性があります。具体的には、カスタム スキーム URL を作成し、実際のページをパラメーターとして渡します。

myappname://external?url=encoded_real_page_url

次に、shouldOverrideUrlLoading関数でカスタム スキームの URL かどうかを確認し、url パラメータを抽出してデコードし、リダイレクトします。

于 2012-01-08T20:54:32.573 に答える