将多个JavaScript注入WebView Android的多元组页面

将多个JavaScript注入WebView Android的多元组页面,javascript,android,webview,Javascript,Android,Webview,比方说,我将我的WebView设置为example.com,然后单击页面并加载example.com/about。 在WebView中,我已经注入了Javascript来修改example.com上的HTML,它起了作用,问题是,如何注入另一个Javascript来修改example.com/about。我的意思是如何将多个JavaScript注入到WebView的多个页面 public class MainActivity extends AppCompatActivity { We

比方说,我将我的WebView设置为example.com,然后单击页面并加载example.com/about。 在WebView中,我已经注入了Javascript来修改example.com上的HTML,它起了作用,问题是,如何注入另一个Javascript来修改example.com/about。我的意思是如何将多个JavaScript注入到WebView的多个页面

public class MainActivity extends AppCompatActivity {

    WebView mWebView;

    private int getScale() {
        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width = display.getWidth();
        Double val = new Double(width) / new Double(100);
        val = val * 100d;
        return val.intValue();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.activity_main_webview);
        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        mWebView.setWebViewClient(new WebViewClient());
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                // Inject CSS when page is done loading
                injectCSS();
                mWebView.loadUrl("javascript:var greeting = function (name) {\n" +
                        "    console.log(\"Great to see you,\" + \" \" + name);\n" +
                        "};");
                super.onPageFinished(view, url);
                //Inject JS to edit html
                injectScriptFile(view, "script.js"); // see below ...

                // test if the script was loaded
                view.loadUrl("javascript:setTimeout(test(), 500)");
            }

            private void injectScriptFile(WebView view, String scriptFile) {
                InputStream input;
                try {
                    input = getAssets().open(scriptFile);
                    byte[] buffer = new byte[input.available()];
                    input.read(buffer);
                    input.close();

                    // String-ify the script byte-array using BASE64 encoding !!!
                    String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
                    view.loadUrl("javascript:(function() {" +
                            "var parent = document.getElementsByTagName('head').item(0);" +
                            "var script = document.createElement('script');" +
                            "script.type = 'text/javascript';" +
                            // Tell the browser to BASE64-decode the string into your script !!!
                            "script.innerHTML = window.atob('" + encoded + "');" +
                            "parent.appendChild(script)" +
                            "})()");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return false;
            }
        });
        mWebView.loadUrl("example.com");
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setDisplayZoomControls(false);
    }

    private void injectCSS() {
        try {
            InputStream inputStream = getAssets().open("style.css");
            byte[] buffer = new byte[inputStream.available()];
            inputStream.read(buffer);
            inputStream.close();
            String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
            mWebView.loadUrl("javascript:(function() {" +
                    "var parent = document.getElementsByTagName('head').item(0);" +
                    "var style = document.createElement('style');" +
                    "style.type = 'text/css';" +
                    // Tell the browser to BASE64-decode the string into your script !!!
                    "style.innerHTML = window.atob('" + encoded + "');" +
                    "parent.appendChild(style)" +
                    "})()");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mWebView.saveState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mWebView.restoreState(savedInstanceState);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu); // Add menu items, second value is the id, use this in the onCreateOptionsMenu
        menu.add(0, 1, 0, "Back");
        menu.add(0, 2, 0, "Refresh");
        menu.add(0, 3, 0, "Forward");
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true; // End of menu configuration
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case 3: //If the ID equals 3 , go forward
                mWebView.canGoForward();
                item.setIcon(R.drawable.forward);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) { // Enables browsing to previous pages with the hardware back button
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { // Check if the key event was the BACK key and if there's history
            mWebView.goBack();
            return true;
        }   // If it wasn't the BACK key or there's no web page history, bubble up to the default
        // system behavior (probably exit the activity)
        return super.onKeyDown(keyCode, event);
    }
}

您的意思是在用户单击webview中的链接时将javascript注入第二个页面吗?如果是这样,代码应该已经按原样工作,
onPageFinished()
在每次加载页面时都会被调用。你试过调试你的应用程序或者添加一些日志来看看会发生什么吗?@JonasCz是的,没错。所以我必须在onPageLoaded()之后调用onPageFinished()?我试过一次。试着使用
onProgressChanged
方法,然后注入javascript。根据我的经验,您正在使用的,
onPageFinished
,并不总是工作得太可靠。@JonasCz-okey这是有道理的。我会试试的。非常感谢。你是说当用户点击webview中的链接时,将javascript注入第二个页面?如果是这样,代码应该已经按原样工作,
onPageFinished()
在每次加载页面时都会被调用。你试过调试你的应用程序或者添加一些日志来看看会发生什么吗?@JonasCz是的,没错。所以我必须在onPageLoaded()之后调用onPageFinished()?我试过一次。试着使用
onProgressChanged
方法,然后注入javascript。根据我的经验,您正在使用的,
onPageFinished
,并不总是工作得太可靠。@JonasCz-okey这是有道理的。我试试看。非常感谢