4

AndroidアプリでWebビューを使用しています。

私は3つのボタンを持っています。1つはウェブサイトへのリンク用で、1つは電話番号に、もう1つはメールボタンです。

最初に私のウェブサイトのボタンを呼び出すと、http://www.somelink.comが機能し ました。

しかし、私のtel:リンクは機能していませんでした。そこで、tel:ボタンを機能させるコードを統合しました。

問題は、それが私のウェブサイトまたはhttp:ボタンを機能させなかったことです。

htmlボタンをクリックしても何も起こりません。

package de.sonae.novolam;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;


@SuppressLint("SetJavaScriptEnabled")
public class DFragment extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mainView = (View) inflater.inflate(R.layout.dfragment, container, false);
WebView webView = (WebView) mainView.findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
    if (url.startsWith("tel:")) { 
            Intent intent = new Intent(Intent.ACTION_DIAL,
                    Uri.parse(url)); 
            startActivity(intent); 
    }

    return true;
}
    });
webView.loadUrl("file:///android_asset/contact.html");
return mainView;
}

public boolean shouldOverrideUrlLoading(WebView webView, String url) {
    if( url.startsWith("http:") || url.startsWith("https:") ) {
        webView.loadUrl(url);
         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
         startActivity( intent ); 
    }

    else if (url.startsWith("mailto:")) { 

    }

    // Otherwise allow the OS to handle it
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    startActivity( intent ); 
    return true;
}
}
4

3 に答える 3

9

コードには 2 つのshouldOverrideUrlLoadingメソッドがあります。最初の 1 つだけが実際に a によって呼び出されますWebView。コードを 2 番目shouldOverrideUrlLoadingから 1 番目に移動すると、機能します。

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
        if (url.startsWith("tel:")) { 
            Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
            startActivity(intent);
            return true;
        } else if( url.startsWith("http:") || url.startsWith("https:") ) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent); 
            return true;
        } else if (url.startsWith("mailto:")) { 
            // TODO : handle mail url
            return true;
        }

        return false;
    }   
});
于 2013-03-04T17:56:08.190 に答える
5

自分で URL の読み込みを処理したときと、それをデリゲート処理したいときを Web ビューに伝える必要があります。shouldOverrideUrlLoading独自のアクションで URL の読み込みを処理したときにtrue を返すだけです。それ以外の場合は false を返します。

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
        if (url.startsWith("tel:")) { 
            Intent intent = new Intent(Intent.ACTION_DIAL,
                    Uri.parse(url)); 
            startActivity(intent); 

            return true; // we handled the url loading
        }

        return false; // let WebView handle this event
    }
});
于 2013-03-04T18:08:41.977 に答える
1

メソッド shouldOverrideUrlLoading は、オーバーライドする (つまり、デフォルトの処理を防止する) 場合は true を返し、正常に動作させる場合は false を返す必要があります。

@Override
public boolean shouldOverrideUrlLoading(WebView wv, String url) {
    if (url.startsWith("tel:")) { 
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
        startActivity(intent);
        return true;
    }

    return false;
}
于 2013-03-04T18:10:34.340 に答える