1. 程式人生 > 其它 >android addJavascriptInterface 不能生效 解決辦法

android addJavascriptInterface 不能生效 解決辦法

如何在webview和javaScrip互動時,注意事項

為了方便,本節用到的HTML都是以檔案的形式放到assets目錄下,只需通過 loadUrl("file:///android_asset/~")即可載入對應的HTML~

1.核心步驟講解:

首先,我們定義一個類,用於將資料暴露出來,JS通過該類暴露的方法(Public)來呼叫Android!

接著,我們在WebView所在頁面Activity,使用下述程式碼:
webview.getSettings().setJavaScriptEnabled(true);
webview.addJavascriptInterface(object,"name");

然後js或者html中呼叫name.xxx呼叫物件裡的暴露的方法:
比如: < input type="button" value="Toast提示" onclick="name.showToast('呵呵');"/>
另外,setJavaScriptEnabled是在Android 4.4以前的系統才有效!!!下一節我們會來講解Android 4.4後 WebKit的變化以及要注意的地方!

 

2.使用示例講解:

1)HTML通過JS顯示Toast與普通列表的對話方塊

執行效果圖

程式碼實現

先準備我們的HTML檔案,建立好後放到assets目錄下:

demo1.html:

<html>
<head>
    <title>Js呼叫Android</title>
</head>

<body>
<input type="button" value="Toast提示" onclick="myObj.showToast('曹神前來日狗~');"/>
<input type="button" value="列表對話方塊" onclick="myObj.showDialog();"/>
</body>
</html>

自定義一個Object物件,js通過該類暴露的方法來呼叫Android

MyObject.java:

/**
 * Created by Jay on 2015/9/11 0011.
 */
public class MyObject {
    private Context context;
    public MyObject(Context context) {
        this.context = context;
    }

    //將顯示Toast和對話方塊的方法暴露給JS指令碼呼叫
@android.webkit.JavascriptInterface //這句必須加上,不加的話不能呼叫
    public void showToast(String name) {
        Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
    }
@android.webkit.JavascriptInterface
public void showDialog() { new AlertDialog.Builder(context) .setTitle("聯絡人列表").setIcon(R.mipmap.ic_lion_icon) 

.setItems(new String[]{"基神", "B神", "曹神", "街神", "翔神"}, null) .setPositiveButton("確定", null).create().show(); } }

最後是MainActivity.java,啟用JavaScript支援,然後通過addJavascriptInterface暴露物件~

public class MainActivity extends AppCompatActivity {
    private WebView wView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wView = (WebView) findViewById(R.id.wView);
        wView.loadUrl("file:///android_asset/demo1.html");
        WebSettings webSettings = wView.getSettings();
        //①設定WebView允許呼叫js
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDefaultTextEncodingName("UTF-8");
        //②將object物件暴露給Js,呼叫addjavascriptInterface
        wView.addJavascriptInterface(new MyObject(MainActivity.this), "myObj");
    }
}