android webview内部的链接被打开两次


Link inside android webview is opened twice

我在android的webview上遇到了一个奇怪的问题。我将一个页面加载到其中有链接的Web视图。我已将Web视图设置为在同一Web视图中打开该链接(而不是在浏览器上)。当打开下一个页面时,它会向mysql写入一些内容。如果用户在同一天已经打开了第二个页面,那么用户将被重定向到第一个页面,并且不会向mysql写入任何内容。我注意到,在第一次按下链接的3-4次中,有1次会将内容写入mysql两次(时间戳相同),并立即将用户重定向到第一页。因此,当点击链接时,url似乎会连续打开两次。在我电脑的浏览器(safari、firefox和chrome)上,一切都能正常工作。我发现一些文章说,图像上的空src字段可能会导致这种情况,但在我的php/html代码中没有空src字段。

Webview设置如下:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_description);
        WebViewClient yourWebClient = new WebViewClient()
        {
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                webView.loadUrl("file:///android_asset/404.html");
            }
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String  url)
            {
             if ( url.contains("google") == false ) {                   
                 webView.loadUrl(url);
                 return false;
             }
             else {
                 Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                 startActivity(i);
                 return true;
             }               
            }
        };
        webView = (WebView) findViewById(R.id.description);
        webView.getSettings().setJavaScriptEnabled(true);
        if (Build.VERSION.SDK_INT >= 11){
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        String url = (MainActivity.URL+"app/description.php?tagid="+tagId+"&screenwidth="+viewPortWidth+"&screenheight="+viewPortHeight+"&deviceid="+MainActivity.myDeviceId+"&lang="+MainActivity.myLanguage+"&os=android);
        webView.setWebViewClient(yourWebClient);
        webView.loadUrl(url);
    }

我的链接只是锚标记中的一个典型div(用php编写):

echo '<a href="description.php?type='.$type.'&screenwidth='.$screenWidth.'&screenheight='.$screenHeight.'&tagid='.$tagid.'&no=1&deviceid='.$deviceid.'&lang='.$language.'">
<div class="redbutton">'.$lang['NO'].'</div></a>';

实际上只返回false,网页将自动加载到WebView中。无需使用webView.loadUrl();

if ( url.contains("google") == false ) {                   
                 return false;
             }

试试看,如果不起作用就告诉我。

如文件所述-

而return false表示当前WebView处理url

好的,我找到了原因。这就是原因:

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String  url)
        {
            if ( url.contains("google") == false ) {
             webView.loadUrl(url);
             return false; // <----THIS LINE
         }
         else {
             Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
             startActivity(i);
             return false;
         }               
        }

这应该是真的。我通过测试发现了这一点:

@Override           
public void onPageFinished(WebView view, String url)
            {
                super.onPageFinished(view, url);
                String url_new = view.getUrl();                
                Log.v("","Webview url: "+url_new);
            }

我注意到,每次按下某个链接时,它都会打印两次url,但当第一次加载webview时,它并没有这样做。当我将return语句更改为true时,它每次点击只打印一次。