React Native 中调用原生 android 模块 Toast 例子及说明

   2016-11-13 0
核心提示:react-native-android-toast react-native 调用原生 android 模块 Toast 学习笔记 参考官方文档初始化一个react-native项目 初始化项目 react-native init androidToast 生成如下目录: 运行命令查看项目react-native run-android如图:接入Android原生模块

react-native-android-toast

react-native 调用原生 android 模块 Toast 学习笔记

参考官方文档初始化一个react-native项目

初始化项目

react-native init androidToast

生成如下目录:

 React Native 中调用原生 android 模块 Toast 例子及说明

运行命令查看项目

react-native run-android

如图:

 React Native 中调用原生 android 模块 Toast 例子及说明

接入Android原生模块

按照官方的说法,第一步需要创建一个java类 本例中为:ToastModule ,并继承 ReactContextBaseJavaModule ,然后复写 getName() 方法,其返回值,就是在 react-native 中引用的 组件名称

复写 getConstants() 方法可以返回一些 常量 用于react-native中调用,官方文档中 return "ToastAndroid" 这个名称在原生的组件中已经存在,返回相同的名称将会冲突,so:改个名字吧!!

@ReactMethod 注解:用于java返回一个 react-native 中可调用的 方法 ,其不能有返回值所以使用 void

注册模块:创建java类 本例中为:ExampleReactPackage ,实现 ReactPackage 接口

复写createJSModules() , createViewManagers() 方法,返回 Collections.emptyList() 空集合

createNativeModules() 方法中添加我们需注册的模块对象, new ToastModule() ,并返回模块集合

添加已注册模块对象到返回集合中,向react-native抛出模块,如:第三步

在react-native中调用,如:第四步

android目录结构

 React Native 中调用原生 android 模块 Toast 例子及说明

注意:引入包的名称不要弄错了

Java & ReactNative 基本类型对照

Java RN
Boolean Bool
Integer Number
Double Number
Float Number
String String
Callback function
ReadableMap Object
ReadableArray Array

第一步:创建模块类

在androidtoast目录下,创建一个ToastModule.java的类

package com.androidtoast; //包名

import android.widget.Toast; //引入调用的类

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;

import java.util.Map;
import java.util.HashMap;

public class ToastModule extends ReactContextBaseJavaModule {

    private static final String DURATION_SHORT_KEY = "SHORT";
    private static final String DURATION_LONG_KEY = "LONG";

    public ToastModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    // 复写方法,返回react-native中调用的 组件名
    @Override
    public String getName() {
        return "ToastNative";
    }
    // 复写方法,返回常量
    @Override
    public Map<String, Object> getConstants() {
        final Map<String, Object> constants = new HashMap<>();
        constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
        constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
        return constants;
    }
    // 使用 @ReactMethod注解返回react-native中可调用的 方法
    @ReactMethod
    public void show(String message, int duration) {
        Toast.makeText(getReactApplicationContext(), message, duration).show();
    }
}

第二步:注册模块

在androidtoast目录下,创建一个ExampleReactPackage.java的类

package com.androidtoast;

import android.widget.Toast;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ExampleReactPackage implements ReactPackage {

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

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(
            ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new ToastModule(reactContext));

        return modules;
    }
}

第三步:添加注册类

添加到 MainApplication.java 中的 getPackages() 方法中

@Override
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
      new MainReactPackage(), // 这个是自动创建
      new ExampleReactPackage() // 这个类是我们创建的
  );
}

项目结构如下:

 React Native 中调用原生 android 模块 Toast 例子及说明

Java部分的代码就结束了,再次提醒下:包名啊!!不要弄错了!!!

第四步:修改react-native代码引入原生模块

修改index.android.js

  • 引入react-native所需模块 NativeModules
  • 获取导出组件 NativeModules.ToastNative
  • 调用方法 show()

修改了下index.android.js文件,代码如下:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
  NativeModules
} from 'react-native';

let toast = NativeModules.ToastNative;

export default class androidToast extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.title}>react-native 调用android原生模块</Text>
        <TouchableOpacity onPress={()=>{
          toast.show('Toast message',toast.SHORT);
        }}>
          <Text style={styles.btn}>Click Me</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  title:{
    fontSize:16,
  },
  btn:{
    fontSize:16,
    paddingVertical:7,
    paddingHorizontal:10,
    borderColor:'#f00',
    borderWidth:1,
    borderRadius:5,
    marginTop:10,
    color:'#f00'
  }
});

AppRegistry.registerComponent('androidToast', () => androidToast);

运行程序

react-native run-android

效果如下:

 React Native 中调用原生 android 模块 Toast 例子及说明

react-native回调函数

*java中提供了一个 Callback 的数据类型对应了react-native中的 function *

具体操作就是在@ReactMethod注解的返回函数中 添加 类型Callback 的参数,并通过 invoke(...params) 调用

RN中通过调用show方法时提供对应的回调函数就可以了, :smile:

  • 修改 ToastModule.java 代码中 show() 方法,添加回调

注意引包!! import com.facebook.react.bridge.Callback;

// 说明下:count,flag是我自定义的变量

@ReactMethod
public void show(String message, int duration ,Callback successCallback, Callback errorCallback) {
    Toast.makeText(getReactApplicationContext(), message, duration).show();
    // 通过invoke调用,随便你传参
    if(flag) successCallback.invoke("success", ++count);
    else errorCallback.invoke("error", ++count);
    flag = !flag;
}
  • 修改 index.android.js 中调用函数
<TouchableOpacity onPress={()=>{
  toast.show('Toast message',toast.SHORT,(message,count)=>{console.log("==",message,count)},(message,count)=>{console.log("++",message,count)});
}}>

:ok_hand: ,试试看吧~~

触发事件

首先我们定义一个发送事件的方法

private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params){
    reactContext
    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
    .emit(eventName, params);
}

引包

import javax.annotation.Nullable;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.ReactContext;

import com.facebook.react.modules.core.DeviceEventManagerModule;

继续改造 show 方法,添加参数,并调用预先定义的方法

// 静态方法
WritableMap map = Arguments.createMap();
map.putBoolean("boolean",true);
map.putDouble("double",0.003);
map.putString("string","string");
sendEvent(this.reactContext, "eventName",map);

改造 index.android.js 啦 ,添加事件监听,这里的 eventName 就是我们 sendEvent 中定义的事件名称

componentWillMount(){
  DeviceEventEmitter.addListener('eventName',(e)=>{
    console.log(e)
  });
}

效果如下:

曾走过的路

曾想在返回的方法中定义一个 Object 类型的变量,但pa! 报错了!!不支持滴,请查看类型对应表格

cloudn't find argument class : Object

参照官方文档时,各种类找不到,瞬间醉了!

# 百度吧,一般不管用
# stackoverflow,Google 有时可以搜到,尼玛!英文。。。
# github
# react-native 源码 !!!这里面有个`ReactAndroid`的目录就是各种`Java`类啦
  react-native/ReactAndroid/src/main/java/com/facebook/

  https://github.com/facebook/react-native

 React Native 中调用原生 android 模块 Toast 例子及说明

参考文档

 
标签: React Native Toast
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 史上最详细的Android原生APP中添加ReactNative进行混合开发教程
    史上最详细的Android原生APP中添加ReactNative
    背景React Native出来已经一段时间了,相对来说也算稳定了,在很多的企业中都实际使用他们,混合开发已经是未来的一种趋势,混合开发中使用的技术很多,不外乎Html5、JS框架通过一定的技术和原始交互,目前主流混合开发React Native、Cordova、APICloud、MUI
  • 基础篇章:关于 React Native 之 ListView 组件的讲解
    基础篇章:关于 React Native 之 ListView 组件
    我们讲完ScrollView组件,其实顺其自然的就应该讲解ListView,对于前段和移动端的开发人员应该非常熟悉这样的控件吧,具体是做什么的,我感觉不用我讲了吧。我们来看看它怎么使用吧。大家好,我是ListView,我是React Native大家族中基础组件中,一个核心组件
  • [原]Mac上搭建React Native Android开发环境并运行
    [原]Mac上搭建React Native Android开发环境并
    react-native目前是越来越火,很多人都开始接触,环境搭建就显得比较重要,具体方法可以看一下这两篇文章 1、mac上搭建步骤 2、Mac OSX 安装nvm(node.js版本管理器)在执行命令 需要使用vpn,才能安装成功,国内网络受限。nvm install node最后执行命令npm i
  • React Native填坑之旅--ListView篇
    列表显示数据,基本什么应用都是必须。笔者写作的时候RN版本是0.34。今天就来从浅到深的看看React Native的ListView怎么使用。首先是使用写死的数据,之后会使用网络请求的数据在界面中显示。最后加上一个ActivityIndicator,网络请求的过程中显示Loading图标
  • 基础篇章:React Native之 ScrollView 的讲解
    基础篇章:React Native之 ScrollView 的讲解
    大家好,我是ScrollView,相信做过移动或者前端开发的人肯定都很熟悉我,对,我就是那个可以滚动的容器,滚有点难听,我是可以滑动的容器,我滑动起来,摩擦摩擦,似魔鬼的步伐。我不仅可以上下滚动,就是垂直,还可以左右滚动,这叫有水平。我厉不厉害?我这
  • 解决React-Native bug:about DialogModule onHo
    问题是这样的,线上的Bugly爆出这样一个错误,而且延续了好多个版本,一直没有解决,崩溃次数已经上千次,因为刚看过RN源码所以斗胆尝试解决一下。Attached DialogModule to host with pending alert but no FragmentManager (not attached to an Activity).c
  • [工具资源] react-native-easy-toast, 一款简单易用的 Toast 组件,支持 Android&iOS.
    [工具资源] react-native-easy-toast, 一款简单
    react-native-easy-toastA react native module to show toast like android, it works on iOS and Android.ContentInstallation Demo Getting started API Contribution Installation1.Run npm i react-native-easy-toast --save 2. import Toast, {DURATION
  • 修改 React-Native Android App 包名
    修改 React-Native Android App 包名
    ReactNative 不知道是为什么(大概是依赖太多?),每次执行 react-native init 创建新项目的时候,总是要等个将近 10 分钟的样子…… 对于初学者来说,需要在短时间内创建好多好多好多的项目,这样每次 init 就要浪费好长的时间。用 verbose 模式一看,其实
点击排行