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})
  }
相关推荐
大熊猫侯佩12 小时前
浪浪山 iOS 奇遇记:给 APP 裹上 Liquid Glass “琉璃罩”(下集)
ui·界面设计·ios 26·液态玻璃·liquid glass·glass effect·glass container
不老刘15 小时前
Base UI:一款极简主义的「无样式」组件库
前端·ui
hqwest16 小时前
QT肝8天16--加载动态菜单
开发语言·数据库·qt·ui·sqlite
兰亭妙微1 天前
[特殊字符]灵感补给站 | pinterest 设计灵感分享 UI版面设计3
ui·审美积累·桌面端界面设计·ui设计公司
兰亭妙微1 天前
兰亭妙微QT软件开发与UI设计协同:如何避免设计与实现脱节?
开发语言·qt·ui
开心-开心急了1 天前
PySide6 文本编辑器(QPlainTextEdit)实现查找功能——重构版本
开发语言·python·ui·重构·pyqt
我命由我123451 天前
Photoshop - Photoshop 工具栏(4)套索工具
经验分享·笔记·学习·ui·职场和发展·职场·photoshop
我命由我123451 天前
Photoshop - Photoshop 更改图像大小
笔记·学习·ui·职场和发展·职场发展·photoshop·ps
ps_xiaowang2 天前
React Query入门指南:简化React应用中的数据获取
前端·其他·react native·react.js
大熊猫侯佩2 天前
浪浪山 iOS 奇遇记:给 APP 裹上 Liquid Glass “琉璃罩”(上集)
ui·界面设计·ios 26·液态玻璃·liquid glass·interactive·glass effect