【问题标题】:how can i wrap an android app as a react native component (complete view)?如何将 android 应用程序包装为反应原生组件(完整视图)?
【发布时间】:2017-04-06 19:03:16
【问题描述】:

我有一个可以工作的 android 本机应用程序,我需要在 react-navigation 中将其作为视图调用,我如何将 android 应用程序包装在一个组件中并在 StackNavigator 中调用它,例如:

const Nav = StackNavigator({
  Login: { screen: LoginView },
  Player: { screen: PlayerView },
  Android: { screen: AndroidView }, //this should be the android native view
},{
    headerMode: 'none',
});

如何将变量传递给该“视图”?

我尝试关注 react-native github 项目上的文档,但我并不完全了解我必须在我的应用中实现什么,因为文档从 android 应用的开头开始。

【问题讨论】:

    标签: javascript android reactjs react-native react-navigation


    【解决方案1】:

    已经实现的本机代码的集成非常简单。请按照以下步骤操作:

    会有三个文件,分别是视图管理器、你的视图文件和包文件

    1) 创建一个 js 文件,您将在其中与本机代码进行通信:

     var { requireNativeComponent, PropTypes } = require('react-native');
    
    var tosendvalue= {
      name: 'xyz',
      propTypes: {
        value: PropTypes.string
      }
    };
    
    module.exports = requireNativeComponent('RCTtest', tosendvalue);
    

    2) 通信的原生类:(查看管理器文件)

    public class TestViewManager extends SimpleViewManager<TestViewDemo>{ 
     public static final String REACT_CLASS = “RCTtest”;
     @Override
     public String getName() {
       return REACT_CLASS;
     }
    
     // Views are created in the createViewInstance method, the view should  //initialize itself in its default state, any properties will be set 
    //via a follow up call to updateView.
    
    
       @Override
         protected TestViewDemo createViewInstance(ThemedReactContext 
            themedReactContext) {
           return new TestViewDemo (themedReactContext);
         }
          //we will check the variable that we have send it from javascript file.
         @ReactProp(name = "value")
    public void setVauleFunction(TestViewDemo view, @Nullable String value) {
       view.setVauleFunction(value);             
    }
    

    3) 你的原生视图:(你的视图类)

       public class TestViewDemo extends Activity {
     //your predefined view
     @Override public void onCreate(Bundle icicle) {
       super.onCreate(icicle);
       setContentView(R.layout.videoview);
       mEditText = (EditText) findViewById(R.id.url);
       mVideoView = (VideoView) findViewById(R.id.surface_view);
       if (path == "") { return; }
       mVideoView.setVideoPath(path);
       mVideoView.setMediaController(new MediaController(this));
       mVideoView.requestFocus();
     }
    
      public void setVauleFunction(value)
     {
      log.e(value)//here you will get your react native value.
     }
        ...
        }
    

    4) 现在你的包文件:

    public class ReactVideoPackage implements ReactPackage {
    
        @Override
        public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
            return Collections.emptyList();
        }
    
        @Override
        public List<Class<? extends JavaScriptModule>> createJSModules() {
            return Collections.emptyList();
        }
    
        @Override
        public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
             //added my view manager
       return Arrays.<ViewManager>asList(new TestViewManager());
        }
    }
    

    干杯:)

    【讨论】:

    • 我还是不明白,我要导入哪些包以及在哪个文件中?我只是这样得到很多错误。我有一个设置一些参数并调用视图活动的主要活动。
    • 在主要活动中,在获取包下插入您的包的名称。不要慌张一步一步来。
    • 本机代码还没有实现,这是第一个问题,如何将它与我的react-native应用程序集成,在导航器上,然后如何传递变量。我现在只有原生代码和我的 react-native 应用程序。我一步一步地按照指南,在我的组件文件夹和本机文件夹 2 个文件 TestViewManager.java、ReactVideoPackage.java 中创建 NativeComm.js,并按照描述修改了 MainActivity.java。现在当我这样做时:从'./NativeComm'导入RCTtest我得到未定义的错误。我应该从哪个文件导入组件?
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多