React-Native 封装Android 原生控件,原生UI,代码解析

原生UI的封装

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.views.text.ReactBaseTextShadowNode;import java.util.HashMap;import java.util.Map;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);    }    @Override    public String getName() {        return "ToastExample";    }    //预定义常量的使用场景    @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;    }    /**     * 给出js调用java的方法     * Java方法需要使用注解@ReactMethod。方法的返回类型必须为void     */    @ReactMethod    public void show(String msg,int time){        Toast.makeText(getReactApplicationContext(),msg,time).show();    }}

原生控件的封装

package com.demo2;import android.support.annotation.Nullable;import android.view.View;import android.webkit.WebView;import android.webkit.WebViewClient;import com.facebook.react.uimanager.SimpleViewManager;import com.facebook.react.uimanager.ThemedReactContext;import com.facebook.react.uimanager.annotations.ReactProp;public class WebViewModel extends SimpleViewManager<WebView> {    @Override    public String getName() {        return "RCTWebView";    }    @Override    protected WebView createViewInstance(ThemedReactContext reactContext) {        WebView webView = new WebView(reactContext);        webView.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                view.loadUrl(url);                return true;            }        });        return webView;    }    @ReactProp(name = "url")    public void setUrl(WebView view, @Nullable String url) {        view.loadUrl(url);    }    @ReactProp(name = "html")    public void setHtml(WebView view, @Nullable String html) {        view.loadData(html, "text/html; charset=utf-8", "UTF-8");    }}

封装好引用

package com.demo2;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.ArrayList;import java.util.List;public class ToastPackage implements ReactPackage{    @Override    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {        List<NativeModule> list= new ArrayList<>();        list.add(new ToastModule(reactContext));        return list;    }    @Override    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {        List<ViewManager> list= new ArrayList<>();        list.add(new WebViewModel());        return list;    }}

Application声明

   @Override    protected List<ReactPackage> getPackages() {      return Arrays.<ReactPackage>asList(          new MainReactPackage(),            new VectorIconsPackage(),              new ToastPackage()      );    }

Js中声明Toast

import { NativeModules } from "react-native";export default NativeModules.ToastExample;

Js中引用Toast

import React, { Component } from "react";import {  Platform,  StyleSheet,  Text,  View,  NativeModules,  Button} from "react-native";import ToastExample from "./ToastExample";export default class Toast extends Component {  aaa = () => {    // NativeModules.ToastExample.show(    //   "32132131321",    //   NativeModules.ToastExample.LONG    ToastExample.show("12212121321", ToastExample.SHORT);  };  render() {    return (      <View style={styles.container}>        <Button title="吐司" onPress={this.aaa} />      </View>    );  }}

Android—>RN传递数据

 @ReactMethod  public void testAndroidCallbackMethod(String msg, Callback callback) {      Toast.makeText(getReactApplicationContext(), msg, Toast.LENGTH_LONG).show();      callback.invoke("Android--->RN传递数据");  }

Js中获取Android 传递的值

import React, { Component } from "react";import {  Platform,  StyleSheet,  Text,  View,  NativeModules,  Button} from "react-native";import Toast from "./ToastExample";export default class C extends Component {  constructor(prosp) {    super(prosp);    this.state = {      value: ""    };  }  Press2 = () => {    Toast.testAndroidCallbackMethod("哈哈哈哈", text => {      this.setState({        value: text      });    });  };  render() {    return (      <View style={styles.container}>        <Text style={styles.welcome}>{this.state.value}</Text>        <Button onPress={this.Press2} title="吐司" />      </View>    );  }}

Js中声明WebVIew

import PropTypes from "prop-types";import { requireNativeComponent, ViewPropTypes } from "react-native";var iface = {  name: "WebView",  propTypes: {    url: PropTypes.string,    html: PropTypes.string,    ...ViewPropTypes // include the default view properties  }};module.exports = requireNativeComponent("RCTWebView", iface, {  nativeOnly: {    testID: true,    renderToHardwareTextureAndroid: true,    accessibilityComponentType: true,    accessibilityLabel: true,    importantForAccessibility: true,    accessibilityLiveRegion: true,    onLayout: true  }});

Js中引用WebVIew

import React, { Component } from "react";import { Platform, StyleSheet, Text, View } from "react-native";import WebView from "./WebDemo";export default class Web extends Component {  render() {    return (      <View style={styles.container}>        <WebView          style={{ flex: 1 }}          html={this.props.navigation.getParam("content", "

请求错误

"
)} /> </View> ); }}

更多相关文章

  1. android倒计时封装(活动进入后台,倒计时依然能正常计时)
  2. Android(安卓)各种音量的获取和设置
  3. Android(安卓)各种音量的获取和设置
  4. Android中文API(96)——SoundEffectConstants
  5. android EditView ime
  6. Android使edittext弹出的软键盘位于输入框下面而不是覆盖输入框
  7. android editText 软键盘enter键图标的设置
  8. Android快速开发框架Android_BaseLib,集成了常用工具类,自定义View
  9. android线程池的封装工具类

随机推荐

  1. Android中LCD背光驱动
  2. Android新手入门 FAQ
  3. Android(安卓)绑定Service 实现android控
  4. Android应用程序内部启动Activity过程(sta
  5. 【Android和iOS】快速切换到主线程更新UI
  6. 中国成Android手机最大市场 占全球份额1/
  7. 关于 android 的JNI的java 调用 C和 C 调
  8. 想抢先体验Android操作系统的魅力吗?那就
  9. 如何构建Android(安卓)1.5系统映像
  10. 开发者指南