reactnative 调用原生UI组件(二),引入xml文件。

reactnative 调用原生UI组件(二),引入xml文件

介绍

react native 调用原生的UI组件,引入原生的布局文件(xml)。

第一布 新建布局文件

复制代码
<?xml version="1.0" encoding="utf-8"?>

<com.MyCustomView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minHeight="150dp"
    android:background="#FD5C08"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"


    >

</com.MyCustomView >

第二布

复制代码
import android.content.Context;
import android.view.LayoutInflater;
import com.facebook.react.common.MapBuilder.Builder;
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.gxl.express.apk.R;

import java.util.Map;

public class MyCustomViewManager extends SimpleViewManager<MyCustomView> {

    public static final String REACT_CLASS = "RCTMyCustomView";

    @Override
    public String getName() { return REACT_CLASS; }

    @Override
    public MyCustomView createViewInstance(ThemedReactContext context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        MyCustomView view = (MyCustomView)inflater.inflate(R.layout.custom_view, null);
        return view;
    }

    @ReactProp(name = "status")
    public void setStatus(MyCustomView view, Boolean status) {
        view.setStatus(status);
    }

    public Map getExportedCustomBubblingEventTypeConstants() {

        String eventName = "onClickEvent";
        String propName = "onClick";
        Map onClickHandler = MapBuilder.of("phasedRegistrationNames",MapBuilder.of("bubbled", propName));

        Builder events = MapBuilder.builder();
        events.put(eventName, onClickHandler);
        return events.build();

    }

}

第三布

复制代码
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.RCTEventEmitter;

public class MyCustomView extends RelativeLayout {

    private boolean status = false;

    public MyCustomView(Context context) {
        super(context);
    }

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void onFinishInflate() {
        super.onFinishInflate();

        this.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                MyCustomView.this.onClick();
            }
        });
    }

    public void setStatus(boolean status) {
        this.status = status;
        setBackgroundColor( this.status ? Color.GREEN : Color.RED);
    }

    public void onClick() {
        WritableMap event = Arguments.createMap();

        event.putString("value1","react demo");
        event.putInt("value2",1);

        ReactContext reactContext = (ReactContext)getContext();
        reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "onClickEvent", event);
    }

}

第四布

复制代码
 @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Arrays.<ViewManager>asList( new MyCustomViewManager()));

    }

第五布

复制代码
 @Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
            packages.add( new TestReactPackage());

          return packages;
        }

第六布

复制代码
import React from 'react';
import { requireNativeComponent } from 'react-native';

type Props = {
  status: Boolean,
  onClick: Function
}

const RCTCustomView = requireNativeComponent('RCTMyCustomView', MyCustomView, {});

class MyCustomView extends React.PureComponent<Props> {
  _onClick = (event) => {
    if (!this.props.onClick) {
      return;
    }

    // process raw event...
    this.props.onClick(event.nativeEvent);
  }

  render() {
    return <RCTCustomView {...this.props} onClick={this._onClick}/>
  }
}

export default MyCustomView;

第七布

复制代码
import MyCustomView from './../component/MyCustomView';
render() {
<MyCustomView 
          status={this.state.status}
          onClick={(event2)=>this.onClick(event2)}
          style={{ width: "100%", height: "100%" }} 
        />

}



onClick ( event2){
    // alert("Received params: " + JSON.stringify(event))
    console.log(event2)
    this.setState({status: !this.state.status})
  }
相关推荐
眠りたいです14 小时前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体
诚实可靠王大锤16 小时前
react-native项目通过华为OBS预签名url实现前端直传
前端·react native·华为
油炸自行车2 天前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
IT古董2 天前
Vue + Vite + Element UI 实现动态主题切换:基于 :root + SCSS 变量的最佳实践
vue.js·ui·scss
Luna-player3 天前
某个工程 pom.xml
xml
三思而后行,慎承诺3 天前
Reactnative实现远程热更新的原理是什么
javascript·react native·react.js
l1t3 天前
对expat库XML_Parse函数调用优化的测试
xml·c语言·解析器·expat
l1t4 天前
利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
xml·c语言·数据结构·人工智能·算法·解析器
叶 落4 天前
[Maven 基础课程]pom.xml
xml·pom.xml 常见配置项·maven 的 pom.xml