touchableopacity react estilos android react-native

android - estilos - react native text



¿Cómo acceder a la actividad desde un módulo React Native Native? (7)

¿Cómo se pasa la actividad a un paquete desde ReactApplication :: getPackages ()?

No entiendo. No encuentro ejemplos claros.

package com.bluetoothioexample; import android.app.Application; import android.util.Log; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.ReactApplication; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import java.util.Arrays; import java.util.List; import com.subsite.bluetoothio.BluetoothIOPackage; import com.oblador.vectoricons.VectorIconsPackage; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override protected boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new BluetoothIOPackage(this), //<- How pass the activity // from ReactApplication ? new VectorIconsPackage() ); } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } }

Respuesta: NO pasa la actividad de MainApplication al paquete.

Llamas a getCurrentActivity () desde tu ReactContextBaseJavaModule

Estoy intentando superar la funcionalidad de Android de mantener la pantalla en React Native. Pensé que podría hacer esto con un módulo simple, sin embargo no sé cómo obtener acceso a la Actividad de Android actual desde dicho módulo.

Necesito la Referencia de actividad para poder llamar a .getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); en eso

Intenté obtener la actividad a través de la conversión como tal ((Activity)getReactApplicationContext().getBaseContext()) , pero esto arroja un error "no se puede convertir a Android.app.Activity"


Editado:

El problema es que getReactApplicationContext () devuelve el contexto de la aplicación y no la actividad. No puede encasillar un contexto de Aplicación a una Actividad.

Esta es una solución simple

Como generalmente, solo hay una actividad (Actividad principal) en reactivo nativo, podemos escribir una función estática en MainActivity para devolver la actividad

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; }

luego llame a MainActivity.getActivity() desde los módulos de puente


Necesitaba modificar un módulo obsoleto ( react-android-360-video ) y encontré esto útil ...

En android/app/src/main/java/com/webcdpmobiledemo/MainApplication.java , usé el nuevo formato para agregar un paquete:

... import com.vrvideocomponent.VrVideoViewPackage; public class MainApplication extends Application implements ReactApplication { ... private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { ... @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new VrVideoViewPackage() ); } ... }; ... }

Y android/app/src/main/java/com/webcdpmobiledemo/MainActivity.java está esencialmente vacío:

package com.yourproject; import com.facebook.react.ReactActivity; public class MainActivity extends ReactActivity { /** * Returns the name of the main component registered from JavaScript. * This is used to schedule rendering of the component. */ @Override protected String getMainComponentName() { return "YourProject"; } }

Luego, modifiqué el archivo VrVideoViewPackage, que necesita pasar el reactContext al VrVideoViewManager que llama:

... public class VrVideoViewPackage implements ReactPackage { ... @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Arrays.<ViewManager>asList( new VrVideoViewManager(reactContext) ); } }

Y finalmente, en el VrVideoViewManager se puede acceder a la actividad así:

... import android.app.Activity; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.bridge.ReactContext; ... public class VrVideoViewManager extends SimpleViewManager<VrVideoView> { ... public VrVideoViewManager(ReactContext reactContext) { // Do not store mActivity, always getCurrentActivity when needed Activity mActivity = mContext.getCurrentActivity(); } @Override protected VrVideoView createViewInstance(ThemedReactContext reactContext) { // You can also activity from ThemedReactContext Activity mActivity = reactContext.getCurrentActivity(); VrVideoView vrView = new VrVideoView(mActivity); vrView.setEventListener(new ActivityEventListener(vrView)); vrView.pauseVideo(); return new VrVideoView(mActivity); } ... }


No está muy claro en https://github.com/facebook/react-native/blob/master/docs/NativeModulesAndroid.md , pero puede leer el código fuente de ToastModule en la distribución nativa de reacción para ver cómo lo hacen. github.com/facebook/react-native/blob/daba14264c9f0d29c0327440df25d81c2f58316c/ReactAndroid/src/main/java/com/facebook/react/modules/toast/ToastModule.java#L31-L33

La idea es que la actividad principal se pase como reactContext en el inicializador para el módulo llamado desde ReactInstanceManager.builder () call en github.com/facebook/react-native/blob/3b4845f93c296ed93c348733809845d587227823/local-cli/generator templates / package / MainActivity.java # L28 a través de la creación de instancias de MainReactPackage github.com/facebook/react-native/blob/daba14264c9f0d29c0327440df25d81c2f58 / las partes de las personas / las personas que se encuentran en el país de los Estados Unidos.


Para 0.28 y anteriores, puede obtener actividad de la actividad private @Nullable Activity mCurrentActivity; , ReactContextBaseJavaModule de ReactContextBaseJavaModule usando el mismo campo.


Supongo que el método getCurrentActivity() de ReactContextBaseJavaModule podría usarse como el siguiente código que se ha copiado del código original 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; } } }


CustomReactPackage.java :

public class CustomReactPackage implements ReactPackage { private Activity mActivity = null; public CustomReactPackage(Activity activity) { mActivity = activity; } @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); // Add native modules here return modules; } public List<Class<? extends JavaScriptModule>> createJSModules() { return Collections.emptyList(); } public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { List<ViewManager> modules = new ArrayList<>(); // Add native UI components here modules.add(new LSPlayerManager(mActivity)); return modules; } }

LSPlayerManager es mi componente de interfaz de usuario nativo. Defino un constructor para poder pasar en la actividad:

public LSPlayerManager(Activity activity) { mActivity = activity; }

Y finalmente, en MainActivity.java donde se define ReactInstanceManager , podemos pasar la actividad a nuestro paquete React personalizado:

mReactInstanceManager = ReactInstanceManager.builder() .setApplication(getApplication()) .setBundleAssetName("index.android.bundle") .setJSMainModuleName("src/index.android") .addPackage(new MainReactPackage()) .addPackage(new CustomReactPackage(this)) // <--- LIKE THIS! .setUseDeveloperSupport(BuildConfig.DEBUG) .setInitialLifecycleState(LifecycleState.RESUMED) .build();

ACTUALIZACION PARA REACCIONAR NATIVO

Esto ya no es cómo accedes a la actividad en un módulo nativo. Consulte https://github.com/facebook/react-native/releases/tag/v0.29.0 para obtener instrucciones de migración