RN 封装 Android原生组件

背景

当在React Native暂时未提供部分原生功能或者模块,我们需要复用部分原生代码时,比如复用一个原生方法,此时就需要将原生方法进行封装,暴露出一个接口来让React-Native调用。

步骤

官网样例

以封装一个自适应字体大小的文本框为例,实现了设置文本、字体大小、可缩小到的最小字体大小、字体颜色、是否中划线、是否下划线、是否加粗、文字对齐方式、文本超出限制时省略号的位置、文本最大行数。

创建一个RN工程

命令行:react-native init 项目名

打开RN工程里的Android项目

创建ViewManager

实现getName方法

getName方法返回的名字在js端引用我们的控件时使用

实现createViewInstance方法

视图是在createViewInstance方法中创建的,视图应该在其默认状态下初始化,任何属性都将通过后续调用来设置updateView

导出给RN使用的属性

要导出给JavaScript使用的属性,需要申明带有@ReactProp(或@ReactPropGroup)注解的设置方法。
方法的第一个参数 view是要修改属性的视图实例,第二个参数 text是要设置的属性值。
方法的返回值类型必须为void,而且访问控制必须被声明为public。
@ReactProp注解必须包含一个字符串类型的参数name。这个参数指定了对应属性在RN端的名字。

class ReactAutoResizeTextViewManager : SimpleViewManager<AutoResizeTextView>() {companion object {const val REACT_CLASS = "REACTAutoResizeTextView"}override fun getName(): String {return REACT_CLASS}override fun createViewInstance(reactContext: ThemedReactContext): AutoResizeTextView {return AutoResizeTextView(reactContext)}@ReactProp(name = "text")fun setText(autoResizeTextView: AutoResizeTextView, text: String) {autoResizeTextView.setText(text)}@ReactProp(name = "textSize")fun setTextSize(autoResizeTextView: AutoResizeTextView, textSize: Float) {autoResizeTextView.setTextSize(textSize)}@ReactProp(name = "gravity")fun setTextGravity(autoResizeTextView: AutoResizeTextView, gravity: String) {autoResizeTextView.setTextGravity(gravity)}@ReactProp(name = "textColor")fun setTextColor(autoResizeTextView: AutoResizeTextView, textColor: String) {autoResizeTextView.setTextColor(textColor)}@ReactProp(name = "maxLines")fun setMaxLines(autoResizeTextView: AutoResizeTextView, maxLines: Int) {autoResizeTextView.setMaxLine(maxLines)}@ReactProp(name = "minTextSize")fun setMinTextSize(autoResizeTextView: AutoResizeTextView, minTextSize: Float) {autoResizeTextView.setMinTextSize(minTextSize)}@ReactProp(name = "underLine")fun setUnderLine(autoResizeTextView: AutoResizeTextView, underLine: Boolean) {autoResizeTextView.setUnderLine(underLine)}@ReactProp(name = "middleLine")fun setMiddleLine(autoResizeTextView: AutoResizeTextView, middleLine: Boolean) {autoResizeTextView.setMiddleLine(middleLine)}@ReactProp(name = "ellipsize")fun setEllipsize(autoResizeTextView: AutoResizeTextView, ellipsize: String) {autoResizeTextView.setEllipsize(ellipsize)}@ReactProp(name = "bold")fun setBold(autoResizeTextView: AutoResizeTextView, bold: Boolean) {autoResizeTextView.setTextStyle(bold)}
}

注册ViewManager

新建ReactViewPackage类,实现ReactPackage的两个方法:createNativeModules,createViewManagers。

createNativeModules是用来添加原生模块的,比如:Toast等。createViewManagers是用来添加原生的UI组件的。
将我们创建的ReactAutoResizeTextViewManager添加到createViewManagers中,如果没有引入原生模块,可以将createNativeModules方返回空数组

class AutoResizeTextViewPackage : ReactPackage {override fun createNativeModules(reactContext: ReactApplicationContext): MutableList<NativeModule> {return Collections.emptyList()}override fun createViewManagers(reactContext: ReactApplicationContext): MutableList<ViewManager<*, *>> {return mutableListOf(ReactAutoResizeTextViewManager())}}

注册Package

在项目的MainApplication.java文件的getPackages方法中添加我们封装的原生模块

@Override
protected List<ReactPackage> getPackages() {List<ReactPackage> packages = new PackageList(this).getPackages();// Packages that cannot be autolinked yet can be added manually here, for example:packages.add(new AutoResizeTextViewPackage());return packages;
}

在js端导出所封装的原生组件

requireNativeComponent通常接受两个参数,第一个参数是原生视图的名字,而第二个参数是一个描述组件接口的对象。组件接口应当声明一个友好的name,用来在调试信息中显示;组件接口还必须声明propTypes字段,用来对应到原生视图上。这个propTypes还可以用来检查用户使用View的方式是否正确。

import {requireNativeComponent,View} from 'react-native'
import {PropTypes} from 'prop-types'const mReactAutoResizeTextView = {name: "REACTAutoResizeTextView",propTypes:{"text":PropTypes.string,"maxLines":PropTypes.number,...View.propTypes}
}export default requireNativeComponent('REACTAutoResizeTextView',mReactAutoResizeTextView)

使用封装好的组件

import React, { Component } from 'react';
import {AppRegistry,StyleSheet,Text,View,DeviceEventEmitter
} from 'react-native';
import ReactAutoResizeTextView from './ReactAutoResizeTextView';class mView extends Component {render() {return (<View style={styles.container}><ReactAutoResizeTextViewstyle={styles.mAutoResizeTextView}text="曾经沧海难为水,除却巫山不是云。取次花丛懒回顾,半缘修道半缘君。"textSize={15}//文字大小middleLine={true}//是否中划线underLine={false}//是否下划线gravity="center"//文字对齐方式,默认左对齐ellipsize="middle"//文字超出限制长度后省略号位置,默认在末尾minTextSize={6}//可缩小到的最小字体大小,若不设,则可以无限缩小bold={true}//是否加粗textColor="#FF0000"//字体颜色maxLines={1}//文字最大行数/></View>)}
};const styles = StyleSheet.create({container:{flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: 'white',},mAutoResizeTextView:{width:300,height:300,},mTitle:{width:300,height:50,marginBottom:30,textAlign:'center',color:'black'}
});AppRegistry.registerComponent('MyNativePackage', () => mView);

运行项目

命令行:react-native run-android

RN 封装 Android原生组件相关推荐

  1. android原生组件,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!

    XUI 一个简洁而又优雅的Android原生UI框架,解放你的双手!还不赶紧点击使用说明文档,体验一下吧! 涵盖绝大部分的UI组件:TextView.Button.EditText.ImageView ...

  2. RN与Android原生交互

    前言:最开始做RN开发的时候,没有和原生打交道,结果居然把项目做出来,后来有人问我,RN页面可以跳转到Activity页面吗?我蒙了,我想了一下为什么还要调到原生页面呢?那样就不兼容andoid和io ...

  3. rn+android+sdk,RN与Android原生交互

    场景:在RN界面中需要调用原生的拍照和选择相册功能,将拍照或者选择的照片的路径回传给RN 步骤如下: 1.RN的界面跳转到原生Activity,并接收从原生回传的数据 import React, { ...

  4. RN 与android原生交互

    缘由 有时候App需要访问平台api,但在RN中没有相应的模块,或者需要你复用一些原生代码,这就需要进一步开发RN原生模块.一般用React Native开发App时会用到一些原生模块,比如:在做社会 ...

  5. flutter嵌入原生组件_Flutter 升级到 1.12.13 后,嵌入Android原生组件的问题

    Flutter 升级到 1.12 后,使用原生Android组件有些变化,需要更新Android代码 关于 Flutter 如何嵌入Android组件请自行百度. 这里我是修改百度地图.import  ...

  6. Android 原生组件日期选择器DatePickerDialog代码实现

    前言 DatePickerDialog 是android开发工具包里的一个日期组件 使用方法如下 private int year, month, day;private void initDateP ...

  7. Uniapp关于 Android原生插件开发案例

    目录 一.准备工作(开发环境) 二.实操 1.使用Android studio开发工具打开UniPlugin-Hello-AS工程请在App离线SDK中查找 ​编辑 2.创建Andorid Libra ...

  8. react-native调用Android原生UI组件

    当react-native的UI组件不能满足需求时,可以考虑在原生自定UI组件,让RN调用.使用原生UI所考虑的问题: 一.原生UI被调用; 二.修改原生UI属性值; 三.捕捉原生UI的响应; 四.R ...

  9. android原生接入rn,Android原生项目集成RN页面

    Android原生接入ReactNative 许久不接触RN,重新捡起重复踩坑,折腾三天就此记录 优化后接入步骤 新建文件夹,将原AndroidStudio项目拷贝至此目录 同目录下新建package ...

最新文章

  1. ubuntu利用apt-get卸载软件
  2. java字节输入与字符输入_Java中的字节输入出流和字符输入输出流
  3. 如何用C#在Excel中生成图表?
  4. vim 插件之commentary
  5. 快速迁移 Next.js 应用到函数计算
  6. 在Ubuntu Linux下安装Tomcat
  7. Excel2010--在指定的范围内添加随机数
  8. 特斯拉2020年第三季度共生产14.5万辆汽车 交付约14万辆
  9. 《『若水新闻』客户端开发教程》——11.代码编码(3)
  10. 三菱GXWorks2 CPU软元件存储器的全部清除
  11. (可远程)开源手机app控制c51单片机,附微信小程序控制
  12. 红帽linux64系统下载,红帽rhel6.5下载
  13. 学计算机辅助设计的,计算机辅助设计学习方法
  14. 笔记本电脑Haswell黑苹果opencore睡眠实战
  15. 微信小程序springboot在线考试系统小程序+后台管理系统 | 计算机毕业设计
  16. 贝尔链CEO Vincent:让游戏玩家从趣味消费到价值收益
  17. Android获取手机设备识别码(IMEI)和手机号码
  18. 实训日志03-学生信息管理系统功能模块(增加,修改,删除,查找)
  19. 如何评价「仙剑奇侠传六」使用Unity 3D引擎?
  20. 顺丰慢其实只是主观感觉,真正原因是以下几个方面

热门文章

  1. hp服务器不显示错误代码,惠普服务器开启不了
  2. 线程池踩坑记 --load飙高的原因
  3. Niagara N4 与物联网的学习经验分享(一 New Station)
  4. delphi 整理的常用函数
  5. 购买服务器及宝塔部署环境指南
  6. Psychopy学习笔记上|online流程,unexpected token
  7. 联想R720使用kali安装NVIDIA显卡驱动
  8. 基于百度AI平台的植物识别系统 新手适用!!
  9. Cisco RV340命令执行漏洞(CVE-2022-20707)及关联历史漏洞分析
  10. 【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表