问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何创建一个android的react-native组件

发布网友 发布时间:2022-04-29 03:12

我来回答

1个回答

热心网友 时间:2022-04-20 14:54

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<WebView> {
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<NativeMole> createNativeMoles(ReactApplicationContext reactContext) {

return Collections.emptyList();;
}

@Override
public List<Class<? extends JavaScriptMole>> createJSMoles() {
return Collections.emptyList();
}

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Arrays.<ViewManager>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,
},
};

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

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

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

var WebView=require('./WebView');
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
焦作有哪些旅行景点值得一去? 河南穿古装去的地方 AE入门从学会套模板开始,AE模板套用简易教程,看起来复杂的AE其实也很... ae怎么套用模板ae模版的使用方法 北京通州区有什么好玩的地方吗 请问现在有哪些看电影的网站?越多越好~~ 帮初中女儿请假一天讲身体不适,班主任却跟别的老师讲她得了大病,该如何... 梦见家中被盗空只剩一件绿色衣的预兆 梦见美丽沙穗 美版4s内置卡贴有什么危害? 中信银行信用卡金卡和普卡有哪些区别 中信银行信用卡中普卡,金卡,白金卡有哪些不同? 全球公爵和全球骑士卡有什么区别,有什么用? 省点花锦鲤卡,公爵,全球购骑士卡哪个好 抖音上的全球公爵和全球购骑士卡应该选择哪一个? 中信信用卡普卡、金卡及白金卡的区别是? - 信息提示 淘宝客服工资怎样?提成怎样算的?大概一个月算上提成多少钱?会不会很累? 淘宝网给好评后怎么拿到奖励? 老外的圣诞节假期大概是多长时间? 我是一名淘宝客服,怎样才能让买家顾客在评价中表扬自己? 请问淘宝客服的提成大约是百分之几 新加坡的假期是怎样的?考虑到去新加坡留学,假期能否回国。 什么是淘宝客服 什么是淘宝客佣金 新加坡一年有哪些公共的假期呢?如果上学的话,学校有长假吗? 淘宝客服怎么算提成的 圣诞节哪些国家会放假?哪些国家不会放假? 要全面的,我给全部的积分? 淘宝客服,提成是怎么算的?最高工资能是多少? 求大神 解答:“淘宝客服制度”(员工与管理层,员工应遵守的规章制度),请尽量详细点! 新加坡共和理工学院的假期有哪些?有没有寒暑假?每个假期多长时间? react-native 组件有哪些 react-native 怎么切换组件 react native怎么控制组件的显示 如何使用 React Native 展示HTML内容 误删微信好友没有电话,,怎样添加回来- 问一问 react native中文网站文档代码示例打不开,老是显示下面的图片,这要怎... 求助React Native 如何获取指定的组件并修改它的样式 react-native怎么动态改变样式 React-Native 中有类似这样的滑动组件么 政治哲学的大体框架是怎么样的? 高中政治哲学框架 ⅴiv0x21可以一起上两个微信吗? 高中政治马克思主义哲学理论框架 x21i可以登两个微信吗 谁有高中政治哲学知识框架 x21a能登几个微信 政治必修一二三各单元归纳知识框架 考研政治马哲复习:如何建立理论框架 vivox21为什么第二个微信系统没响应? VIVOX21在文件管理中怎么找到微信分身数据 怎么卸载微信分身应用