Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将REACT原生js文件切换到Android活动_Android_Facebook_Reactjs_Npm_React Native - Fatal编程技术网

如何将REACT原生js文件切换到Android活动

如何将REACT原生js文件切换到Android活动,android,facebook,reactjs,npm,react-native,Android,Facebook,Reactjs,Npm,React Native,我需要在JS文件中的按钮单击事件上从反应本机活动切换到本机android活动。我已经找了很多了。请帮助我。为您的原生android活动创建一个意向过滤器 <activity> <intent-filter> <data android:scheme="my.special.scheme" /> <action android:name="android.intent.action.VIEW" />

我需要在JS文件中的按钮单击事件上从反应本机活动切换到本机android活动。我已经找了很多了。请帮助我。

为您的原生android活动创建一个意向过滤器

<activity>
    <intent-filter>
        <data android:scheme="my.special.scheme" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT"></category>
    </intent-filter>
</activity>

为本机android活动创建一个意向过滤器

<activity>
    <intent-filter>
        <data android:scheme="my.special.scheme" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT"></category>
    </intent-filter>
</activity>

您可以创建一个模块,并向JS公开一个
ReactMethod
,它将为您打开活动

public class RctActivityModule extends ReactContextBaseJavaModule {
    public static final String REACT_CLASS = "RctActivity";

    public RctActivityModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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

    @ReactMethod @SuppressWarnings("unused")
    public void startActivity(String extraParam) {
        Activity context = ContextProvider.getActivityContext();
        if (context != null && !context.isFinishing()) {
            Intent rctActivityIntent = new Intent(context, RctActivity.class);
            rctActivityIntent.putExtra(RctActivity.EXTRA_PARAM, extraParam);
            context.startActivity(rctActivityIntent);
        }
    }
}
别忘了将新模块添加到软件包中

public class RCCPackage implements ReactPackage {

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(
                new RctActivityModule(reactContext)
        );
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    ...
    }
}
在JavaScript代码(index.js)中,导入
RctActivity
模块:

从“/RctActivity”导入RctActivity

并使用您公开的方法,如下所示:
RctActivity.startActivity('MyExtraParam')

编辑: 为了打开一个新的活动,我必须保留对当前正在运行的活动的引用。所以我使用了这个小助手类:

public class ContextProvider {
    private static WeakReference<Activity> sActivityWR;

    public static void setActivityContext(Activity activity) {
        if (sActivityWR == null) {
            sActivityWR = new WeakReference<>(activity);
        }
    }

    public static Activity getActivityContext() {
        return sActivityWR != null ? sActivityWR.get() : null;
    }

    public static void clearActivityContext() {
        if (sActivityWR != null) {
            sActivityWR.clear();
        }
        sActivityWR = null;
    }
}

不要忘记,现在您的
main活动
需要扩展
RctActivity

您可以创建一个模块并向JS公开一个
ReactMethod
,JS将为您打开活动

public class RctActivityModule extends ReactContextBaseJavaModule {
    public static final String REACT_CLASS = "RctActivity";

    public RctActivityModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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

    @ReactMethod @SuppressWarnings("unused")
    public void startActivity(String extraParam) {
        Activity context = ContextProvider.getActivityContext();
        if (context != null && !context.isFinishing()) {
            Intent rctActivityIntent = new Intent(context, RctActivity.class);
            rctActivityIntent.putExtra(RctActivity.EXTRA_PARAM, extraParam);
            context.startActivity(rctActivityIntent);
        }
    }
}
别忘了将新模块添加到软件包中

public class RCCPackage implements ReactPackage {

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(
                new RctActivityModule(reactContext)
        );
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    ...
    }
}
在JavaScript代码(index.js)中,导入
RctActivity
模块:

从“/RctActivity”导入RctActivity

并使用您公开的方法,如下所示:
RctActivity.startActivity('MyExtraParam')

编辑: 为了打开一个新的活动,我必须保留对当前正在运行的活动的引用。所以我使用了这个小助手类:

public class ContextProvider {
    private static WeakReference<Activity> sActivityWR;

    public static void setActivityContext(Activity activity) {
        if (sActivityWR == null) {
            sActivityWR = new WeakReference<>(activity);
        }
    }

    public static Activity getActivityContext() {
        return sActivityWR != null ? sActivityWR.get() : null;
    }

    public static void clearActivityContext() {
        if (sActivityWR != null) {
            sActivityWR.clear();
        }
        sActivityWR = null;
    }
}

不要忘记,现在您的
main活动
需要扩展
RctActivity

获取错误:console.error:“发生错误”,{“framestoop”:1,“code:“EUNSPECIFIED”},堆栈:error@56404:12@15859:94缺少下面的行:获取错误:console.error:“发生错误”,{“framestoop”:1,“代码”:“EUNSPECIFIED”},堆栈:error@56404:12@15859:94缺少下面的行:无法解析类“RctActivityModule”中的“ContextProvider”。上下文提供程序是我编写的一个小帮助程序类。我将把它添加到我在js文件中导入的答案中:import'./home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity'............并且面临错误。。。。。。。。。需要未知模块“/home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity”。如果您确定模块在那里,请尝试重新启动包。创建本机模块的JavaScript表示是常见的做法。创建一个js文件并将其命名为
RctActivity
<代码>从“react native”导入{NativeModules}
module.exports=NativeModules.RctActivity我重新启动了应用程序,但再次遇到错误,要求未知模块无法解析类“RctActivityModule”中的“ContextProvider”。上下文提供程序是我编写的一个小助手类。我将把它添加到我在js文件中导入的答案中:import'./home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity'............并且面临错误。。。。。。。。。需要未知模块“/home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity”。如果您确定模块在那里,请尝试重新启动包。创建本机模块的JavaScript表示是常见的做法。创建一个js文件并将其命名为
RctActivity
<代码>从“react native”导入{NativeModules}
module.exports=NativeModules.RctActivity我重新启动了应用程序,但再次面临错误,需要未知模块我已经尝试了很多方法来解决它,这两个答案也无法解决问题。它不应该被搁置。我已经尝试了很多来解决它,这两个答案也无法解决问题。它不应该被搁置。