Android Fragmentとの統合
既存アプリとの統合のガイドでは、フルスクリーンのReact Nativeアプリを既存のAndroidアプリにアクティビティとして統合する方法を詳しく説明しています。
既存のアプリでフラグメント内にReact Nativeコンポーネントを使用するには、いくつかの追加設定が必要です。
1. React Nativeをアプリに追加する
既存アプリとの統合のガイドに従って、フルスクリーンのアクティビティでReact Nativeアプリを安全に実行できることを確認してください。
2. React Native Fragment用のFrameLayoutを追加する
この例では、FrameLayout
を使用してReact Native FragmentをActivityに追加します。このアプローチは十分に柔軟であり、ボトムシートやタブレイアウトなど、他のレイアウトで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
インターフェースを実装していることを確認します
- 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() {
+ super.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() {
+ super.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
に追加します。
ビルダー内では、フラグメントの作成方法をカスタマイズできます
setComponentName
は、レンダリングするコンポーネントの名前です。これは、registerComponent
メソッド内のindex.js
で指定された文字列と同じです。setLaunchOptions
は、コンポーネントに初期プロパティを渡すオプションのメソッドです。これはオプションであり、使用しない場合は削除できます。
5. 統合をテストする
yarn start
を実行してバンドラーを実行し、次にAndroid StudioでAndroidアプリを実行してください。アプリは開発サーバーからJavaScript/TypeScriptコードをロードし、ActivityのReact Native Fragmentに表示する必要があります。
アプリはこのようになります