ReactNative封装Android原生组件
本篇以封装按钮组件为例.
Ready
在开始封装之前,希望你已经在本机搭建好React Native的Android运行环境.
Go
Android部分
- 创建一个原生的按钮,并为其添加映射事件以及按钮属性
package com.RCTButton; import android.view.View; import android.widget.Button; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.events.RCTEventEmitter; import java.util.Map; import javax.annotation.Nullable; public class RCTButton extends SimpleViewManager<Button> { private ThemedReactContext mContext; // private static final String EVENT_NAME_ONCLICK_NATIVE = "onClick"; private static final String EVENT_NAME_ONCLICK_NATIVE = "nativeClick"; private static final String EVENT_NAME_ONCLICK_JS = "jsClick"; @Override public String getName() { return "RCTButton"; } @Override protected Button createViewInstance(ThemedReactContext reactContext) { this.mContext = reactContext; Button button = new Button(reactContext); return button; } @Override protected void addEventEmitters(final ThemedReactContext reactContext, Button view) { super.addEventEmitters(reactContext, view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { WritableMap data = Arguments.createMap(); data.putString("msg", "点击按钮"); reactContext.getJSModule(RCTEventEmitter.class).receiveEvent( v.getId(), EVENT_NAME_ONCLICK_NATIVE, data ); } }); } /* name="text" : name对应的值是在js代码中使用该封装组件时的属性名。 */ @ReactProp(name = "text") public void setText(Button button, String text) { button.setText(text); } @Nullable @Override public Map<String, Object> getExportedCustomDirectEventTypeConstants() { return MapBuilder.<String, Object>builder() .put( EVENT_NAME_ONCLICK_NATIVE, MapBuilder.of( "registrationName", EVENT_NAME_ONCLICK_JS)) .build(); } }
- 注册该UI组件
package com.RCTButton; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Arrays; import java.util.Collections; import java.util.List; public class RCTViewPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Arrays.<ViewManager>asList(new RCTButton()); } }
- 在MainApplication中注册
package com.batsoftapp; import android.app.Application; import com.RCTButton.RCTViewPackage; import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader; import java.util.Arrays; import java.util.List; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new RCTViewPackage() ); } @Override protected String getJSMainModuleName() { return "index"; } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); } }
React Native JS部分
'use strict'; import React, {PureComponent} from 'react'; import { View, Image, FlatList, StyleSheet, TouchableOpacity, requireNativeComponent } from 'react-native'; import PropTypes from 'prop-types'; let rctButton = { name: 'RCTButton', propTypes: { text: PropTypes.string, ...View.propTypes } } let RCTButton = requireNativeComponent('RCTButton', rctButton); export default class Example extends PureComponent { jsClick(event) { alert(event.nativeEvent.msg) } render(){ <View style={[ThemeStyle.container}]}> <RCTButton style={{height: 50, width: 200}} text={'点击'} jsClick={(event) => this.jsClick(event)}/> </View> } }
最终效果

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Xamarin 开发过的那些项目
原文: Xamarin 开发过的那些项目 您可能已经看到类似的统计数据:智能手机用户在手机媒体上花费了89%的时间使用应用程序。或者听说Gartner预测到2017年移动应用程序下载将产生价值770亿美元的收入。很难不考虑这些数字。今天,每个企业都必须接受创建移动应用程序的必要性,以保留喜欢通过移动解决问题的用户。开发移动应用程序的首席执行官和初创公司熟悉速度与质量,iOS与Android,混合与本土之间的斗争。而Xamarin肯定会改变游戏规则。 Xamarin一直在风靡世界。在其存在的5年多的时间里,它已发展到120个国家的140万开发者,并被微软收购成为其Visual Studio环境的一部分。这使Xamarin成为能源,交通,媒体,医疗保健等领域的15,000家公司的首选技术。我们将进一步研究一些杰出的Xamarin应用程序示例。今天,Xamarin不仅提供了构建跨平台移动应用程序的平台,还进一步支持开发生态系统来测试和调试产品。Xamarin测试云例如,开发人员可以在2000多台真实设备上运行他们的Xamarin应用程序并分析详细的报告。另一项服务Xamarin.Insigh...
- 下一篇
Flutter快速上车之Widget
作者:闲鱼技术-意境 Flutter作为一种全新的响应式,跨平台,高性能的移动开发框架。从开源以来,已经得到越来越多开发者的喜爱。闲鱼是最早一批与谷歌展开合作,并在重要的商品详情页中使用上线的公司。一路走来,积累了大量的开发经验。虽然越来越多的技术大牛在flutter世界中弄得风声水起,但是肯定有很多的flutter小白希望能快速上手,享受flutter编程的乐趣。本文就是面向刚刚踏上futter的同学,从Flutter体系中最基本的一个概念widget入手学习Flutter。希望能助力每一位初学者。 可能大家要问的第一个问题是为什么从Widget开始? 从flutter的架构图中不难看出widget是整个视图描述的基础。Flutter 的核心设计思想便是 Everything’s a Widget 即一切即Widget。在flutter的
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7