Android中的a href链接不起作用

4
我正在使用Android App中的webview。
我有3个按钮,一个用于链接到网站,一个用于拨打电话号码,另一个是电子邮件按钮。
开始时,链接到我的网站的按钮可以正常使用,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;
}
}
3个回答

9

您的代码中有两个shouldOverrideUrlLoading方法,实际上只有第一个被WebView调用。将第二个shouldOverrideUrlLoading中的代码移动到第一个中,它就可以正常工作。

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

5

当您自己处理URL加载时,需要告诉Web视图,并在需要委托处理时进行通知。如果您通过自己的操作处理URL加载,请从shouldOverrideUrlLoading返回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
    }
});

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接