与 Android 片段集成
“与现有应用集成”指南详细介绍了如何将全屏 React Native 应用作为Activity集成到现有 Android 应用中。
要在现有应用的Fragment中使用 React Native 组件,需要进行一些额外的设置。
1. 将 React Native 添加到你的应用
请按照“与现有应用集成”指南的全部内容操作,以确保你可以在全屏 Activity 中安全地运行你的 React Native 应用。
2. 为 React Native Fragment 添加 FrameLayout
在本示例中,我们将使用 FrameLayout 将 React Native Fragment 添加到 Activity。这种方法足够灵活,可以适应在其他布局(如 Bottom Sheets 或 Tab Layouts)中使用 React Native。
首先,在 Activity 的布局(例如 res/layouts 文件夹中的 main_activity.xml)中添加一个带有 id、宽度和高度的 <FrameLayout>。此布局将用于渲染你的 React Native Fragment。
<FrameLayout
android:id="@+id/react_native_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3. 使宿主 Activity 实现 DefaultHardwareBackBtnHandler
由于你的宿主 Activity 不是 ReactActivity,因此你需要实现 DefaultHardwareBackBtnHandler 接口来处理返回按钮按下事件。React Native 需要这个接口来处理返回按钮按下事件。
进入你的宿主 Activity,并确保它实现了 DefaultHardwareBackBtnHandler 接口。
Activity.onBackPressed() 自 API 级别 33 起已被弃用。在 API 级别 36 以上的应用中,Android 16 设备将不再调用此方法,而应使用OnBackPressedDispatcher。
- Java
- Kotlin
package <your-package-here>
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
+class MainActivity : AppCompatActivity() {
+class MainActivity : AppCompatActivity(), DefaultHardwareBackBtnHandler {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
findViewById<Button>(R.id.sample_button).setOnClickListener {
// Handle button click
}
}
+ override fun invokeDefaultOnBackPressed() {
+ onBackPressedDispatcher.onBackPressed()
+ }
}
package <your-package-here>;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
+import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
-class MainActivity extends AppCompatActivity {
+class MainActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
findViewById(R.id.button_appcompose).setOnClickListener(button -> {
// Handle button click
});
}
+ @Override
+ public void invokeDefaultOnBackPressed() {
+ getOnBackPressedDispatcher().onBackPressed();
+ }
}
4. 将 React Native Fragment 添加到 FrameLayout
最后,我们可以更新 Activity 以将 React Native Fragment 添加到 FrameLayout。在此特定示例中,我们假设你的 Activity 中有一个 id 为 sample_button 的按钮,单击该按钮会将 React Native Fragment 渲染到 FrameLayout 中。
按如下方式更新 Activity 的 onCreate 方法:
- Java
- Kotlin
package <your-package-here>
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import com.facebook.react.ReactFragment
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
public class MainActivity : AppCompatActivity(), DefaultHardwareBackBtnHandler {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
findViewById<Button>(R.id.sample_button).setOnClickListener {
+ val reactNativeFragment = ReactFragment.Builder()
+ .setComponentName("HelloWorld")
+ .setLaunchOptions(Bundle().apply { putString("message", "my value") })
+ .build()
+ supportFragmentManager
+ .beginTransaction()
+ .add(R.id.react_native_fragment, reactNativeFragment)
+ .commit()
}
}
override fun invokeDefaultOnBackPressed() {
super.onBackPressed()
}
}
package <your-package-here>;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
+import com.facebook.react.ReactFragment;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
public class MainActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
findViewById(R.id.button_appcompose).setOnClickListener(button -> {
+ Bundle launchOptions = new Bundle();
+ launchOptions.putString("message", "my value");
+
+ ReactFragment fragment = new ReactFragment.Builder()
+ .setComponentName("HelloWorld")
+ .setLaunchOptions(launchOptions)
+ .build();
+ getSupportFragmentManager()
+ .beginTransaction()
+ .add(R.id.react_native_fragment, fragment)
+ .commit();
});
}
@Override
public void invokeDefaultOnBackPressed() {
super.onBackPressed();
}
}
让我们看一下上面的代码。
ReactFragment.Builder() 用于创建新的 ReactFragment,然后我们使用 supportFragmentManager 将该 Fragment 添加到 FrameLayout。
在 builder 中,你可以自定义 Fragment 的创建方式。
setComponentName是你想要渲染的组件的名称。它与registerComponent方法中的index.js中指定的字符串相同。setLaunchOptions是一个可选方法,用于将初始 props 传递给你的组件。这是可选的,如果不用,可以将其删除。
5. 测试你的集成
请确保运行 yarn start 来启动 bundler,然后从 Android Studio 运行你的 Android 应用。该应用应从开发服务器加载 JavaScript/TypeScript 代码,并在 Activity 中的 React Native Fragment 中显示它。
你的应用应该看起来像这样:
