Calling a Android Native UI component method from React native Js code

前端 未结 3 1910
春和景丽
春和景丽 2021-02-08 09:06

I have created a CustomView SignatureView.java which extends LinearLayout for capturing signature in Android Native.

And created SignatureCapturePackage.java and Signatu

3条回答
  •  南旧
    南旧 (楼主)
    2021-02-08 09:38

    As per the pointer given by @agent_hunt.

    check this blog for explaination

    I have used ui manager commands in SignatureCaptureViewManager. Posting my solutions

    public class SignatureCaptureViewManager extends ViewGroupManager {
    private Activity mCurrentActivity;
    
    public static final String PROPS_SAVE_IMAGE_FILE="saveImageFileInExtStorage";
    public static final String PROPS_VIEW_MODE = "viewMode";
    
    public static final int COMMAND_SAVE_IMAGE = 1;
    
    
    public SignatureCaptureViewManager(Activity activity) {
        mCurrentActivity = activity;
    }
    
    @Override
    public String getName() {
        return "SignatureView";
    }
    
    @ReactProp(name = PROPS_SAVE_IMAGE_FILE)
    public void setSaveImageFileInExtStorage(SignatureCaptureMainView view, @Nullable Boolean saveFile) {
        Log.d("React View manager setSaveFileInExtStorage:", "" + saveFile);
        if(view!=null){
            view.setSaveFileInExtStorage(saveFile);
        }
    }
    
    @ReactProp(name = PROPS_VIEW_MODE)
    public void setViewMode(SignatureCaptureMainView view, @Nullable String viewMode) {
        Log.d("React View manager setViewMode:", "" + viewMode);
        if(view!=null){
            view.setViewMode(viewMode);
        }
    }
    
    @Override
    public SignatureCaptureMainView createViewInstance(ThemedReactContext context) {
        Log.d("React"," View manager createViewInstance:");
        return new SignatureCaptureMainView(context, mCurrentActivity);
    }
    
    @Override
    public Map getCommandsMap() {
        Log.d("React"," View manager getCommandsMap:");
        return MapBuilder.of(
                "saveImage",
                COMMAND_SAVE_IMAGE);
    }
    
    @Override
    public void receiveCommand(
            SignatureCaptureMainView view,
            int commandType,
            @Nullable ReadableArray args) {
        Assertions.assertNotNull(view);
        Assertions.assertNotNull(args);
        switch (commandType) {
            case COMMAND_SAVE_IMAGE: {
                view.saveImage();
                return;
            }
    
            default:
                throw new IllegalArgumentException(String.format(
                        "Unsupported command %d received by %s.",
                        commandType,
                        getClass().getSimpleName()));
        }
    }
    
    
    }
    

    For sending commands to ViewManager i have added this method in Signature Capture component

    class SignatureCapture extends React.Component {
    
    constructor() {
    super();
    this.onChange = this.onChange.bind(this);
    }
    
    onChange(event) {
    console.log("Signature  ON Change Event");
    if (!this.props.onSaveEvent) {
      return;
    }
    
    this.props.onSaveEvent({
      pathName: event.nativeEvent.pathName,
      encoded: event.nativeEvent.encoded,
    });
     }
    
     render() {
      return (
       
    );
      }
    
    saveImage(){
     UIManager.dispatchViewManagerCommand(
            React.findNodeHandle(this),
            UIManager.SignatureView.Commands.saveImage,
            [],
        );
       }
     }
    
    SignatureCapture.propTypes = {
    ...View.propTypes,
    rotateClockwise: PropTypes.bool,
    square:PropTypes.bool,
    saveImageFileInExtStorage: PropTypes.bool,
    viewMode:PropTypes.string
    };
    
      var SignatureView = requireNativeComponent('SignatureView',   SignatureCapture, {
     nativeOnly: {onChange: true}
     });
    
     module.exports = SignatureCapture;
    

    This is how i am using SignatureCapture component in my parent Signature component

    class Signature extends Component {
    
    render() {
    
        return (
            
    
                
    
                 { this.saveSign() } } >
                    Save
                
    
            
        );
    }
    // Calls Save method of native view and triggers onSaveEvent callback
    saveSign() {
        this.refs["sign"].saveImage();        
    }
    
    _onSaveEvent(result) {
        //result.encoded - for the base64 encoded png
        //result.pathName - for the file path name
        console.log(result);
      }
    
      }
    
     export default Signature;
    

提交回复
热议问题