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