【问题标题】:Android webview ajaxAndroid webview ajax
【发布时间】:2013-04-15 18:24:31
【问题描述】:

我有一个 wep 应用程序,其中一些页面必须执行 ajax 请求才能获取和更新该页面而不刷新页面。

我使用 android WebView 加载该 wep 应用程序时遇到的问题。所有请求 ajax 的页面都不会更新页面,这意味着 ajax 请求不起作用。

这里是 MainActivity.java 的代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_layout);
        webView = (WebView) findViewById(R.id.webView);
        webView.clearCache(true);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.d(LOG_TAG, message);
                new AlertDialog.Builder(view.getContext())
                        .setMessage(message).setCancelable(true).show();
                result.confirm();
                return true;
            }
        });
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                Toast.makeText(view.getContext(), "onPageStarted", Toast.LENGTH_SHORT).show();
                super.onPageStarted(view, url, favicon); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Toast.makeText(view.getContext(), "onPageFinished", Toast.LENGTH_SHORT).show();
                super.onPageFinished(view, url); //To change body of generated methods, choose Tools | Templates.
            }
        });

        WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setUseWideViewPort(true);
        webView.loadUrl("http://192.168.1.236:8080/mobile/android.html");
}

并且 android.html 有 ajax 请求。 android 应用程序工作正常并加载 android.html 但没有获取 ajax 数据

【问题讨论】:

  • 你的 ajax 代码可以在桌面浏览器上运行吗?
  • 也许您没有在清单中设置必要的权限?试试这个:stackoverflow.com/questions/13956726/…
  • @galuano1 :是的,它在所有浏览器中都能正常工作
  • @JeremyG :我设置了权限。页面加载所有内容,除了来自 ajax 请求的数据
  • 你测试的是哪个安卓版本? GB?

标签: java android ajax get


【解决方案1】:

经过漫长的 3 天后,我终于找到了答案。
问题出在我请求的具有此代码的页面中:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

在与 android webview 冲突且不适用于 jquery 选择器的响应中......不知道为什么!!!

但是当我从响应页面中删除上述代码时,它的 ajax 工作正常。

P.S:我所有的页面都是 xhtml 而不是 html。

【讨论】:

  • 如果同样的答案适用于您的另一个问题 - stackoverflow.com/a/16047023 - 这是否意味着它们实际上是重复的?
  • 在什么问题或答案中重复。当然,问题中没有重复,但我追踪了我的问题,发现问题出在哪里,并要求它获得一些帮助..所以当我找到问题的答案时,它也会自动成为另一个问题的答案,我分享了答案,因为如果其他人面临类似问题,请获得解决方案。就是这样
【解决方案2】:
  1. 检查您的 AppManifest.xml 文件中是否有 &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
  2. 如果加载页面中的 javascript 向 http://192.168.1.236:8080 以外的某个站点发出请求,并且该站点不允许跨域 XMLHTTPRequests,则由于 WebView 的安全限制,这些请求将失败。

【讨论】:

  • 1.我添加了permession。并且页面加载除了来自ajax请求2的数据之外的所有内容。我不知道我的应用程序是否允许跨域,所以我会搜索它,如果没有,将搜索如何允许跨域tomcat 服务器或在我的网络应用程序上
  • 我允许跨原点但没有改变任何东西。
  • 您的网络应用程序是否可以在内置的 Android 浏览器中运行?网络应用程序本身可能有问题?
  • 是的,我的网络应用程序在内置的安卓浏览器中运行良好....终于我找到了解决方案。感谢您的帮助。
【解决方案3】:

试试这个

WebView web=(WebView) findViewById(R.id.webView1);
web.getSettings().setJavaScriptEnabled(true);

【讨论】:

    【解决方案4】:

    您可以将 AJAX 处理程序添加到您的 Web 视图中,以使用 AJAX 处理任何网站。

    public class Main2Activity extends AppCompatActivity {
    
        private WebView webView;
        private ProgressBar progressBar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            webView = (WebView) findViewById(R.id.webView);
            progressBar = (ProgressBar) findViewById(R.id.progressBar);
            progressBar.setVisibility(View.GONE);
            webView.getSettings().setJavaScriptEnabled(true);
            initWebView();
            loadURL();
        }
    
        private void loadURL() {
            webView.loadUrl("www.google.com");
        }
    
        @SuppressLint("JavascriptInterface")
        private void initWebView() {
            webView.setWebChromeClient(new MyWebChromeClient(Main2Activity.this));
            webView.addJavascriptInterface(new AjaxHandler(Main2Activity.this), "ajaxHandler");
            webView.getSettings().setJavaScriptEnabled(true);
    
            webView.setWebViewClient(new WebViewClient() {
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);
                    progressBar.setVisibility(View.GONE);
    
                }
    
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
                    progressBar.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                    super.onReceivedError(view, request, error);
                    progressBar.setVisibility(View.GONE);
                }
            });
        }
    
        public class AjaxHandler {
    
            private static final String TAG = "AjaxHandler";
            private final Context context;
    
            public AjaxHandler(Context context) {
                this.context = context;
            }
    
            public void ajaxBegin() {
                Log.e(TAG, "AJAX Begin");
                Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show();
            }
    
            public void ajaxDone() {
                Log.e(TAG, "AJAX Done");
                Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show();
            }
        }
    
        private class MyWebChromeClient extends WebChromeClient {
            Context context;
    
            public MyWebChromeClient(Context context) {
                super();
                this.context = context;
            }
        }
    
    }
    

    【讨论】:

    • 这个解决方案不完整,你在哪里使用 ajaxBegin() 和 ajaxDone() ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多