中易网

如何创建一个Android原生的react-native组件

答案:2  悬赏:10  
解决时间 2021-03-22 14:17
如何创建一个Android原生的react-native组件
最佳答案
Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候不得不自己动手封装一下,从而能够使用那些React Native没有为自己封装的原生组件,比如WebView,官方并没有提供Android端的实现,那么现在就动手封装一下WebView。

之前一篇文章Android React Native使用原生模块,而使用原生UI组件的方法和使用原生模块的方法十分类似。

首先,需要继承SimpleViewManager这个泛型类,和原生模块类似,需要重写getName()方法,将UI组件名称暴露给javascript层,接着需要重写createViewInstance方法,在里面返回需要使用的原生UI组件的实例,这里就是WebView。然后就是暴露一些必要属性给javascript层,为了简单起见,这里只暴露两个属性,一个是url,一个是html,一旦javascript层设置了url,就会加载一个网页,而一旦设置了html,则会去加载这段html,而属性的暴露是使用注解,将注解设置在对应的set方法上,之后再set方法中处理UI的更新,比如一旦设置了url,在setUrl里面就要加载网页。最终的ViewManager就是这样子的

public class ReactWebViewManager extends SimpleViewManager {
public static final String REACT_CLASS = "RCTWebView";
@Override
public String getName() {
return REACT_CLASS;
}

@Override
protected WebView createViewInstance(ThemedReactContext reactContext) {
WebView webView= new WebView(reactContext);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
return webView;
}

@ReactProp(name = "url")
public void setUrl(WebView view,@Nullable String url) {
Log.e("TAG", "setUrl");
view.loadUrl(url);
}
@ReactProp(name = "html")
public void setHtml(WebView view,@Nullable String html) {
Log.e("TAG", "setHtml");
view.loadData(html, "text/html; charset=utf-8", "UTF-8");
}
}

和原生模块一样,原生UI组件也需要进行注册,实现ReactPackage接口,进行WebView的注册。

public class AppReactPackage implements ReactPackage {
@Override
public List createNativeModules(ReactApplicationContext reactContext) {

return Collections.emptyList();;
}

@Override
public List> createJSModules() {
return Collections.emptyList();
}

@Override
public List createViewManagers(ReactApplicationContext reactContext) {
return Arrays.asList(
new ReactWebViewManager());
}
}

将这个ReactPackage添加到ReactInstanceManager实例中去

.addPackage(new AppReactPackage())

然后在javascript层新建一个WebView.js文件。输入下面的内容

'use strict';

var { requireNativeComponent,PropTypes } = require('react-native');

var iface = {
name: 'WebView',
propTypes: {
url: PropTypes.string,
html: PropTypes.string,
},
};

module.exports = requireNativeComponent('RCTWebView', iface);

可以看到,只是在里面指定了属性的类型。

到目前为止,已经可以使用这个WebView组件了。

var WebView=require('./WebView');
全部回答
react native(rn)最近可谓风头正劲,受到许多开发者的关注,其中不乏敢于尝试(zizuozishou)的小伙决定使用react native来开发app。但是,react native的android版本才开源不到1年,网上能找到的资料非常有限,书籍目前也只有ios版的,所以其中的坑也是很多的。下面我就总结一下创建第一个rn android app的步骤和遇到的坑。 http://blog.csdn.net/naiba01/article/details/51429182
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
I can’t tell you how sorry I am 中文翻译
哈尔滨秋实中学有个彭茹老师吗?老家是五常的
cad2004中角度设置怎么样精确到秒
吉林大学测控技术与仪器专业(工科试验班)就业
游览木渎古镇大概多少时间
青岛经济技术开发区(黄岛区)哪里卖活性炭啊
工商管理本科毕业的好找工作吗?
武昌南湖城际列车到花湖
【金鱼草的养殖方法】如何养殖金鱼草
根充完后去医生那里补牙,结果牙齿疼,医生说
格兰仕蒸汽炉是最安全的吗?
请问逆战里面塔防模式是不是打过英雄模式了所
在上海学厨师哪个学校好
现在12mm硅酸钙板的价格,规格为2440*1220mm
淘宝买的ndsi翻新机。上下屏幕色调不一样,下
推荐资讯
女生练跆拳道好还是散打好?
西陵石化加油站(西陵镇)怎么去啊,我要去那办
请问班车能否携带40*40*40cm的保险柜上车吗
万达加油站(大册营镇北宋村)地址有知道的么?
深圳市公积金中心福田办事大厅在哪?什么公交
重庆2月下旬天气怎么样?适合游玩吗?应该穿什
Dear Grandma and grandpa什么意思本人
北京大兴亦庄 求兼职
孩子为什么"学习动力不足
甲减化验结果是什么样的
滴水观音滴出来的液体有毒吗?
为什么尸体派对CP5我总是进不了理科室
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?