React Native 学习笔记十三(原生模块之Toast)
来源:互联网 发布:小满科技 数据怎么样 编辑:程序博客网 时间:2024/05/01 04:05
在学习官网上的Toast 的过程中 出现很多的坑
废话就不说了 官网上都有 官网讲解
实现思路 :
我们之前已经将react-native 嵌入原生了 那么 我们就在之前的基础上进行修改就好了
创建ToastUtils.java 继承ReactContextBaseJavaModule 我们要明确自己的目的 就是使用js调用 Toast 就像android 原生一样 能够在屏幕底端进行输出 那么我们需要自己封装方法 供js调用 我们希望调用的形式为ToastShow.show('des',ToastShow.LONG) 那么我们就要自定义 show方法 以及常量 来提供给js
所以具体代码的实现如下:
import android.widget.Toast;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.bridge.ReactContextBaseJavaModule;import com.facebook.react.bridge.ReactMethod;import java.util.HashMap;import java.util.Map;import javax.annotation.Nullable;/** * Created by zhangyanjiao on 17/9/19. * * 功能:在js中写Toast.show('toast text',Toast.SHORT) 可以像原生的toast一样输出东西 * 注:RN已经内置了一个名为ToastAndroid的模块 */public class ToastUtils extends ReactContextBaseJavaModule{ private static final String DURATION_SHORT_KEY="SHORT"; private static final String DURATION_LONG_KEY="LONG"; public ToastUtils(ReactApplicationContext reactContext) { super(reactContext); } /** *该方法的返回值 的RCT前缀可以自动被移除 所以 即使返回值是RCTToast 在js中也会编译通过 * 在js中会根据这个方法返回的字符串来查找对应的类 * @return */ @Override public String getName() { return "ToastShow"; } /** * 该方法 不一定需要实现 所以可能返回值为空 一般用来返回一些可以被js同步访问的常量 或者是预定义的值 * 在本类中 我们需要给js两个常量 * @return */ @Nullable @Override public Map<String, Object> getConstants() { final HashMap<String, Object> constants = new HashMap<>(); constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG); constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT); return constants; } /** * 要导出一个方法给JavaScript使用,Java方法需要使用注解@ReactMethod。方法的返回类型必须为void。 * React Native的跨语言访问是异步进行的,所以想要给JavaScript返回一个值的唯一办法是使用回调函数或者发送事件 * 下面的参数类型在@ReactMethod注明的方法中,会被直接映射到它们对应的JavaScript类型。 Boolean -> Bool Integer -> Number Double -> Number Float -> Number String -> String Callback -> function ReadableMap -> Object ReadableArray -> Array * @param msg 弹出的提示信息 * @param duration 显示事件长短 */ @ReactMethod public void show(String msg,int duration){ Toast.makeText(getReactApplicationContext(),msg,duration).show(); }}
然后要进行注册 否则的话 js将无法找到该类
创建 RegistPackage.java 实现ReactPackage接口
import com.facebook.react.ReactPackage;import com.facebook.react.bridge.JavaScriptModule;import com.facebook.react.bridge.NativeModule;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.uimanager.ViewManager;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * Created by zhangyanjiao on 16/9/20. */public class RegistPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new ToastUtils(reactContext)); return modules; } @Override public List<Class<? extends JavaScriptModule>> createJSModules() { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); }}
别忘了在mainActivity中添加 addPackage
.addPackage(new RegistPackage())
最后为了在js文件中更方便的使用 我们对调用进行封装
创建ToastShow.js文件 具体实现如下
'use strict'/** * This exposes the native ToastAndroid module as a JS module. This has a function 'show' * which takes the following parameters: * * 1. String message: A string with the text to toast * 2. int duration: The duration of the toast. May be ToastAndroid.SHORT or ToastAndroid.LONG */import { NativeModules } from 'react-native';// 下一句中的ToastAndroid即对应上文// public String getName()中返回的字符串// 练习时请务必选择另外的名字!export default NativeModules.ToastShow;
此时我们就可以安心引用了
在index.android.js文件中
import React, { Component } from 'react';import { AppRegistry, StyleSheet, Text, View,} from 'react-native';import ToastShow from './ToastShow'var { NativeModules } = require('react-native'); class MyApp extends Component { constructor(props) { super(props); } render() { ToastShow.show('我是弹窗',ToastShow.LONG); return( <View > <Text>{'hahahhahhahah'}</Text> </View> ) }}AppRegistry.registerComponent('MyApp', () => MyApp);
记住修改完 要进行重新的编译 运行 直接使用热更新的话 会报错
0 0
- React Native 学习笔记十三(原生模块之Toast)
- React Native调用原生模块--Toast
- React Native 学习笔记十四(原生模块之数据回调)
- react native学习之Toast
- react native 学习笔记----使用Android的原生模块
- React-Native 原生模块(iOS)调用
- react-native 添加 Toast 模块
- React Native 学习笔记十二(嵌入原生应用 甚是坑啊)
- react native使用原生模块
- React Native十四:原生模块
- React Native使用指南-原生模块
- React Native创建原生模块
- react native使用原生模块
- React Native For Android学习之路-创建自定义原生模块
- React Native 原生模块开发笔记 (Android/iOS)
- React Native 十三:植入原生应用
- React Native 十三:植入原生应用
- 【稀饭】react native 实战系列教程之自定义原生模块
- uboot and 文件系统 烧写
- 记录学习的点滴(Js跳转)
- Ubuntu下安装&卸载apache2服务
- Toast总结二
- codeforce-628B-Cards
- React Native 学习笔记十三(原生模块之Toast)
- java中string stringbuffer和stringBuilder区别
- Swift 指南
- 探寻次时代渲染 - CryEngine2
- android知识小贴士之二:基于位置的服务
- 解决Genymotion模拟器不能上网的问题
- python实现微信提醒({“errcode”:41011,”errmsg”:”missing agentid”})
- lr参数化取值规则总结
- 谁都没想到,乐视超级电视涨价的真相竟然是......