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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL数据库在高并发下的优化方案
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 面试大杂烩
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程