为什么80%的码农都做不了架构师?>>>
问题如下
1、android调用js方法无效的问题
我的原因是少了
webView.setWebChromeClient(new WebChromeClient());这一句
2、js调用android方法无效的问题
我的原因:在api>17之后为了解决webviewjs调用任意代码的漏洞,要给回调的方法加上
@JavascriptInterface 使用方式可以看下面的源码
解决后的代码:
public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";WebView webView;String text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView= (WebView) findViewById(R.id.main_webview);webView.getSettings().setJavascriptEnabled(true);webView.setWebChromeClient(new WebChromeClient());
//这一句是为了不让外部链接跳转到其他app去执行,而是在我们自己的webview上显示
// webView.setWebViewClient(new WebViewClient(){
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// view.loadUrl(url);
// return false;
// }
// });//我在raw目录下存放了一个test.html文件,代码在后面InputStream inputStream = getResources().openRawResource(R.raw.test);try {text=readStreamText(inputStream);
//加载本地的html文件webView.loadData(text,"text/html","utf-8");//设置js回调的方法,回调方法要加上@JavascriptInterface注释,第二个参数对应js中window.demo中的demowebView.addJavascriptInterface(new Object(){@JavascriptInterfacepublic void clickon(){Toast.makeText(MainActivity.this, "js call android", Toast.LENGTH_SHORT).show();}},"demo");Log.i(TAG,"text="+text);} catch (IOException e) {e.printStackTrace();}}private String readStreamText(InputStream inputStream) throws IOException {BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));StringBuffer b=new StringBuffer();String temp=null;while ((temp=reader.readLine())!=null)b.append(temp);reader.close();return b.toString();}
//android调用js的testa函数,加入webView.setWebChromeClient(new WebChromeClient())后成功alertpublic void c(View v){new Handler().post(new Runnable() {@Overridepublic void run() {webView.loadUrl("Javascript:testa()");}});}}
html(raw目录下):
hello js