Call Android methods from JavaScript

前端 未结 4 611
不知归路
不知归路 2020-12-04 10:04

I searched, but I didn\'t find an answer. I\'m developing an Android app based on webview, using HTML5 and JavaScript. Can I call an Android method, like makeToast()

相关标签:
4条回答
  • 2020-12-04 10:52

    Just because it is more convenient (layout):

    <?xml version="1.0" encoding="utf-8"?>
    <WebView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    
    0 讨论(0)
  • 2020-12-04 10:56

    Check out WebView's addJavascriptInterface() method:

    http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

    0 讨论(0)
  • 2020-12-04 11:04

    After creating your Main Activity code you need to create your Javascript code and call WebviewInterface from that, Let's see the example:

    public class MainActivity extends AppCompatActivity {
    
    String TAG = "MainActivity";
    Context context;
    WebView mWebView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
    
        mWebView = (WebView) findViewById(R.id.webview);
        initWebView();
    
        String ENROLLMENT_URL = "file:///android_asset/about_page.html";
        mWebView.loadUrl(ENROLLMENT_URL);
    
    }
    
    @SuppressLint({ "SetJavaScriptEnabled" })
    private void initWebView() {
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.addJavascriptInterface(new WebviewInterface(), "Interface");
    }
    
    public class WebviewInterface {
        @JavascriptInterface
        public void javaMehod(String val) {
            Log.i(TAG, val);
            Toast.makeText(context, val, Toast.LENGTH_SHORT).show();
        }
    }
    }
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.legendblogs.android.MainActivity">
    
    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webview"/>
    
    
    </RelativeLayout>
    

    Look at this link to see full example https://www.legendblogs.com/blog/how-to-call-native-java-methods-from-webview-javascript/121764

    0 讨论(0)
  • 2020-12-04 11:08

    You can do this by adding a JavaScript Interface to your WebView and exposing specific methods to the JavaScript code running in your web view. In other words, you'll need to wrap the calls to Android's Toast class in a method you create in your activity/fragment.

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <WebView android:id="@+id/web_view"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"/>
    
    </RelativeLayout>
    

    MainActivity.java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            WebView webView = (WebView)findViewById(R.id.web_view);
            webView.loadUrl("file:///android_asset/web.html");
    
            webView.getSettings().setJavaScriptEnabled(true);
            webView.addJavascriptInterface(new WebViewJavaScriptInterface(this), "app");
        }
    
        /*
         * JavaScript Interface. Web code can access methods in here 
         * (as long as they have the @JavascriptInterface annotation)
         */
        public class WebViewJavaScriptInterface{
    
            private Context context;
    
            /*
             * Need a reference to the context in order to sent a post message
             */
            public WebViewJavaScriptInterface(Context context){
                this.context = context;
            }
    
            /* 
             * This method can be called from Android. @JavascriptInterface 
             * required after SDK version 17. 
             */
            @JavascriptInterface
            public void makeToast(String message, boolean lengthLong){
                Toast.makeText(context, message, (lengthLong ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT)).show();
            }
        }
    
    }
    

    assets/web.html

    <!DOCTYPE html>
    <html>
    <head>
        <title>JavaScript View</title>
    
        <script type="text/javascript">
    
            function showToast(){
                var message = document.getElementById("message").value;
                var lengthLong = document.getElementById("length").checked;
    
                /* 
                    Call the 'makeToast' method in the Java code. 
                    'app' is specified in MainActivity.java when 
                    adding the JavaScript interface. 
                 */
                app.makeToast(message, lengthLong);
                return false;
            }
    
            /* 
                Call the 'showToast' method when the form gets 
                submitted (by pressing button or return key on keyboard). 
             */
            window.onload = function(){
                var form = document.getElementById("form");
                form.onsubmit = showToast;
            }
        </script>
    </head>
    
    <body>
    
    <form id="form">
        Message: <input id="message" name="message" type="text"/><br />
        Long: <input id="length" name="length" type="checkbox" /><br />
    
        <input type="submit" value="Make Toast" />
    </form>
    
    </body>
    </html>
    

    A Toast Message

    0 讨论(0)
提交回复
热议问题