我试图跨越Android的功能,让屏幕保持在React Native上。我想我可以用一个简单的模块来做这件事,但是我不知道如何从这个模块访问当前的Android活动。
我需要活动引用,以便可以对其调用.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
我试图通过像这样的((Activity)getReactApplicationContext().getBaseContext())
类型转换来获取活动,但这抛出了一个"cannot be cast to Android.app.Activity“错误
发布于 2016-03-30 22:03:48
我猜ReactContextBaseJavaModule的getCurrentActivity()
方法可以像下面的代码一样使用,它是从React-Native
的原始代码复制过来的;
import android.app.Activity;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
public class AwesomeModule extends ReactContextBaseJavaModule {
public AwesomeModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "AwesomeAndroid";
}
private static final String ERROR_NO_ACTIVITY = "E_NO_ACTIVITY";
private static final String ERROR_NO_ACTIVITY_MESSAGE = "Tried to do the something while not attached to an Activity";
@ReactMethod
public void doSomething(successCallback, errorCallback) {
final Activity activity = getCurrentActivity();
if (activity == null) {
errorCallback(ERROR_NO_ACTIVITY, ERROR_NO_ACTIVITY_MESSAGE);
return;
}
}
}
发布于 2015-09-24 12:00:03
编辑:
问题是getReactApplicationContext()返回的是应用程序的上下文,而不是活动。不能将应用程序上下文类型转换为活动。
这是一个简单的解决方法
因为通常在react-native中只有一个活动(主活动),所以我们可以用MainActivity编写一个静态函数来返回该活动
private static Activity mCurrentActivity = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCurrentActivity = this;
...
}
...
public static Activity getActivity(){
Activity activity = new Activity();
activity = mCurrentActivity;
return activity;
}
然后从桥接模块调用MainActivity.getActivity()
发布于 2020-08-12 22:33:02
使用UI线程上下文获取活动/窗口/装饰视图
在您的类文件中,导入包括...
import android.view.WindowManager;
import android.view.Window;
import android.view.View;
在你的类构造函数中...
private static ReactApplicationContext reactContext;
MyModule(ReactApplicationContext context) {
super(context);
reactContext = context;
}
然后在类方法中...
@ReactMethod
public void doSomethingRequiringWindow() {
// get access to current UI thread first
reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Window window = reactContext
.getCurrentActivity().getWindow();
View decorView = reactContext
.getCurrentActivity().getWindow().getDecorView();
// you have access to main ui thread so you can effect
// immediate behavior on window and decorView
}
});
}
https://stackoverflow.com/questions/32704336
复制相似问题