Android WebView使用React
背景
本人工作中日常使用React开发H5页面较多,最近有需要写一个安卓App,于是简单学习了一下安卓的基础。本文将介绍如何在安卓WebView中嵌入React页面,快速搭建一个安卓应用。本文适合那些想快速搭建一个安卓APP的H5开发。本文还包括页面通过JavaScript
与原生交互的简单例子。
React
本文默认你是一个比较熟悉React的前端开发。如不熟悉可以参考React官方的QuickStart。
创建完成后执行npm run build
打包,工程目录下面将生成build
文件夹,打开build
下的index.html
即可查看我们开发好的React
页面,后面我们将会用到。
如果打开是空白,需要在package.json
里面添加一行配置:
{
"homepage": "."
}
安卓
安卓直接新建一个项目,选择Empty Activity
。一路next最后生成一个页面显示HelloWorld项目。如下新建一个AssetsFolder
,将上一步生成的build
文件夹放入安卓工程的assets
文件夹里。
放入assets
文件夹:
修改MainActivity.java
如下,记得按提示导入所需的库
public class MainActivity extends AppCompatActivity {
private long exitTime = 0;
private WebView webView;
private EditText edit_text;
private Button test_button;
private TextView text;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = new WebView(this);
getSupportActionBar().hide();
webView.setWebViewClient(new WebViewClient() {
//设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
});
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDefaultTextEncodingName("utf-8");//设置WebView属性,运行执行js脚本
webView.loadUrl("file:///android_asset/build/index.html"); //调用loadUrl方法为WebView加入链接
webView.addJavascriptInterface(new MyObject(MainActivity.this), "myObj");//添加一些webView方法调用原生的javascript方法
setContentView(webView);
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
super.onBackPressed();
}
}
}
}
添加一个类,用来封装js接口,暴露出来,用于页面与原生的交互:
public class MyObject {
private Context context;
public MyObject(Context context) {
this.context = context;
}
//将显示Toast和对话框的方法暴露给JS脚本调用
@JavascriptInterface
public void showToast(String name) {
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}
//此处返回值为空void,如需数据交互,按需返回数据,前端js代码即可收到数据
@JavascriptInterface
public void showDialog() {
new AlertDialog.Builder(context)
.setTitle("品牌列表").setIcon(R.mipmap.ic_launcher_round)
.setItems(new String[]{"卡萨帝", "海尔", "统帅"}, null)
.setPositiveButton("确定", null).create().show();
}
}
页面可以如下调用MyObject类:
<input type="button" value="Toast提示" onclick="myObj.showToast('js调用原生测试');"/>
<input type="button" value="列表对话框" onclick="myObj.showDialog();"/>
然后运行及即可,打开即跳转到我们开发的React页面。
我们可以通过以上方法可以开发一些简单的APP,如果复杂的还需要用原生开发,毕竟WebView
性能有限。
补充原生调用JS函数并返回数据:
webView.evaluateJavascript("javascript:callJS()",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
//将button显示的文字改成JS返回的字符串
button.setText(s);
}
});
前端代码:
<script>
// Android需要调用的方法
function callJS(){
document.getElementById("test").innerHTML = "调用成功";
return 'JS返回值';
}
</script>
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhichjhj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22