【问题标题】:How can we run a function when the website responds or changes its page in web view?当网站响应或更改网页视图中的页面时,我们如何运行函数?
【发布时间】:2019-10-31 11:21:20
【问题描述】:

我的问题是,如果网站上有一个按钮,那么当用户点击它时,它就会出现在某个页面上。我想在显示信息时启用功能。请帮帮我。

私有WebView webView; 私有 ProgressBar progressXml; 私有RelativeLayoutWaitPageXml; // 用户等待页面 private RelativeLayout NoInternetPage;// 无连接页面显示给你的用户

protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState);

     setContentView(R.layout.phone_number);

     webView = findViewById(R.id.WebViewXml);
     progressXml = findViewById(R.id.progressXml);
    WaitPageXml = findViewById(R.id.WaitPageXml);


    webView = findViewById(R.id.WebViewXml);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setInitialScale(15);
    WebSettings mWebSettings = webView.getSettings();
    webView.getSettings().setUseWideViewPort(true);
    WebSettings webSettings = webView.getSettings();
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setSupportMultipleWindows(true);
    webView.getSettings().setSupportZoom(true);
    mWebSettings.setAllowFileAccess(true);
    mWebSettings.setAllowFileAccess(true);
    mWebSettings.setAllowContentAccess(true);
    webView.addJavascriptInterface(new MyJavaScriptInterface(),
            "android");

webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap 
            favicon) {
                if (isOnline()) {
                    progressXml.setVisibility(View.VISIBLE);
                    WaitPageXml.setVisibility(View.VISIBLE);
                    super.onPageStarted(view, url, favicon);

                } else {
                    super.onPageStarted(view, url, favicon);
                    NoInternetPage.setVisibility(View.VISIBLE);
                }


            }

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

                progressXml.setVisibility(View.GONE);
                WaitPageXml.setVisibility(View.GONE);
                NoInternetPage.setVisibility(View.GONE);

        });

webView.loadUrl("https://......");

@Override
public void onBackPressed() {

    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();

    }

}

public boolean isOnline() { //用于测试连接.... ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); @SuppressLint("MissingPermission") NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnectedOrConnecting()) { 返回真; } 别的 { 返回假; } }

很遗憾,响应没有被网站执行

【问题讨论】:

    标签: android webview


    【解决方案1】:

    我很难准确说出您想要从您的问题中得到什么,但从我的解释来看,您需要在网页中按下按钮来触发某种 UI 更新(弹出窗口、字段更新等)。有几种不同的方法可以做到这一点,我不完全确定哪种方法是您想要完成的最佳解决方案。

    但是,鉴于您已将此问题作为 Android 问题发布并提供了一个源列表,其中包括您设置 Web 视图的工作,我假设您正在寻找一种方法来连接从 HTML 页面按下按钮到一些 Java 回调。如果是这样的话,你已经在那儿了。当您调用webView.addJavascriptInterface(new MyJavaScriptInterface(), "android"); 时,它会将MyJavaScriptInterface 的实例作为全局JavaScript 变量注入。

    您没有列出MyJavaScriptInterface 的实现,因此我们假设它是一个使用JavascriptInterface 注释声明的类,旨在传递给addJavascriptInterface。使用 JavascriptInterface 注释类会将其公共方法公开给 JavaScript。假设你有这样声明你的类:

    @JavascriptInterface
    class MyJavaScriptInterface {
        public void doSomething() {
            Log.d("MyJavaScriptInterface", "Got a callback from JavaScript");
        }
    }
    

    由于您在设置WebView 时添加了一个名为“android”的此类实例,因此您现在可以在JavaScript 中使用android.doSomething() 调用我们的doSomething 函数。例如,假设这是您调用 webView.loadUrl("https://......"); 时加载的 HTML:

    <html>
        <head>
            <script>
                function onButtonPressed() {
                    android.doSomething();
                }
            </script>
        </head>
        <body>
            <button onclick="onButtonPressed();">Click me!</button>
        </body>
    </html>
    

    在这种情况下,单击页面上的按钮将一直调用到 Java 类中的doSomething。从那里,您可以做任何您需要做的事情来显示您的信息。请注意,doSomething 不需要为空;如果您需要显示要由 JavaScript 处理但本机检索的信息,它也可以返回数据。

    如需更多帮助,您可以查看有关此主题的 Android 开发人员指南here

    【讨论】:

    • 感谢您的回答,花时间试试这个方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多