【问题标题】:My android webview loads pages within the webview in "Nexus 5X API 25" but does not loads in "Galaxy Nexus API 22 (Android 5.1.1)"我的 android webview 在“Nexus 5X API 25”的 webview 中加载页面,但未在“Galaxy Nexus API 22 (Android 5.1.1)”中​​加载
【发布时间】:2017-04-26 18:06:35
【问题描述】:

如果有人可以尝试这个简单的示例并运行应用程序,我将不胜感激。当 url 加载时,向下滚动一点并尝试单击一个橙色按钮,上面写着“带我去那里”,在两个不同的设备中有两种不同的行为。在 Nexus 5X 中,它在同一个 Webview 中加载目标,但在 Galaxy Nexus API 22 (Android 5.1.1) 中,它在默认的 android 浏览器中打开目标。我希望我能够传达我的问题。我尝试搜索解决方案,但找不到。请帮忙!!!!!!!!!!!!!!!!!!!

package in.ac.cus.webview;

import android.annotation.TargetApi;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

private WebView myWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Webview initial setup procedure
    myWebView = (WebView) findViewById(R.id.webview);
    WebSettings websettings = myWebView.getSettings();
    websettings.setJavaScriptEnabled(true);
    myWebView.loadUrl("http://library.cus.ac.in");
    myWebView.setWebViewClient(new WebViewClient());
}

private class WebViewClient extends android.webkit.WebViewClient {
    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
    }
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        return true;
    }
}

}

【问题讨论】:

  • 当然可以。你认为startActivity(intent); 会做什么?
  • 我实际上是 android 先生/妈妈的新手,所以我无法找出问题所在。但是为什么两个不同的设备会有两种不同的行为呢?一个在同一个 webview 中打开,另一个在默认浏览器中打开。我希望所有链接在所有 android 设备上的同一个 webview 中打开。请帮帮我先生/妈妈
  • 您可能还想查看@TargetApi(Build.VERSION_CODES.N) 的含义。它是负责不同操作系统版本上不同行为的部分
  • 先生/妈妈,即使我删除了 @TargetApi(Build.VERSION_CODES.N) 行,它仍然给我相同的结果。先生/妈妈,我很抱歉给您带来麻烦,但我真的很痛苦。

标签: java android webview


【解决方案1】:

public booleanshouldOverrideUrlLoading(WebView view, WebResourceRequest request) 方法针对的是 android N,即 7.x.x 在您的其他shouldOverrideUrlLoading 方法中,您要求系统处理网络,这就是它打开手机浏览器的原因。你应该在这两种方法中做同样的事情。将给定的 url 加载到 de webView 中。

private class WebViewClient extends android.webkit.WebViewClient {
    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        return true;
    }   
}

【讨论】:

  • 先生/妈妈,即使我删除了@TargetApi(Build.VERSION_CODES.N) 行,它仍然给我相同的结果。
  • 非常感谢您的帮助。我想我已经解决了。我已经删除了方法 public boolean shouldOverrideUrlLoading(WebView view, String url) 并刚刚实现了方法 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 并且很可能是我的解决方案。再次感谢您的及时回复。
  • 最终你需要实现另一种方法,检查你的 WebViewClient 在旧版本上的行为,我不确定新方法是否适合他们。
  • 如果此答案是正确的,请将其标记为正确答案。在此先感谢,您需要什么,请再次询问:)
  • 我将最小 api 保持为 21。并删除了 @targetAPI 注释并实现了新的 shouldOverrideUrlLoading 方法,令人惊讶的是,它似乎给了我想要的结果。但仍然需要彻底测试。如果需要,肯定会征求您的宝贵意见和建议。非常感谢先生。
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2014-04-02
相关资源
最近更新 更多