2014-10-01 122 views
0

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

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

回答

2

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

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

试一试,让我知道如果不工作。

由于Documentation状态 -

而返回false表示当前的WebView处理URL

+0

经过测试,它似乎工作。谢谢您的回复! – Juuso 2014-10-10 21:09:18

+0

如果这是正确的。您可以将其标记为正确的答案,以帮助未来遇到同样问题的程序员。 – Darpan 2014-10-11 09:04:54

0

好吧,我发现这样做的原因。这是原因:

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

这应该已经返回true。我发现了这一点,通过这个测试:

@Override   
public void onPageFinished(WebView view, String url) 
      { 

       super.onPageFinished(view, url); 
       String url_new = view.getUrl();     

       Log.v("","Webview url: "+url_new); 

      } 

我注意到,它的每一个,有些链接被按下时,打印出来的URL两次,但它并没有这样做,当web视图加载第一次。当我将return语句更改为true时,它只会按照它应该做的每次点击打印一次。

+1

'返回FALSE'是做正确的事。你需要了解这种方式背后的原因。找到我的答案如下.' – Darpan 2014-10-09 10:27:15

相关问题