skip to Main Content

enter image description hereI have a Kotlin-based native Android chat app that I want to integrate into my React Native project as an android library. The React Native app has a bottom tab bar with four tabs, one for accessing the chat feature. However, when users tap on the chat tab, it opens a new instance of the chat activity, causing the React Native tab bar to disappear and the chat activity to overlay the screen. How can I seamlessly display the native Android chat activity within the React Native app without hiding the tab bar or creating new instances of the app?

Following is my code:

  • This is my tabs component using ‘@react-navigation/bottom-tabs’:
const WelcomePageTabs = ({ disabled, onListContainerPress, onSettingsScreenFocused }: IProps) => {
    const { t } = useTranslation();
    const RecentListScreen = useCallback(() =>
        (
            <RecentList
                disabled = { disabled }
                onListContainerPress = { onListContainerPress } />
        ), []);

    const calendarEnabled = useSelector(isCalendarEnabled);

    const CalendarListScreen = useCallback(() =>
        (
            <CalendarList
                disabled = { disabled } />
        ), []);

    const SettingsScreen = useCallback(() =>
        (
            <SettingsNavigationContainer
                isInWelcomePage = { true } />
        ), []);

    return (
        <WelcomePage.Navigator
            backBehavior = { 'none' }
            screenOptions = {{
                ...tabBarOptions,
                headerShown: false
            }}>
            <WelcomePage.Screen
                listeners = {{
                    tabPress: () => {
                        onSettingsScreenFocused(false);
                    }
                }}
                name = { screen.welcome.tabs.recent }
                options = {{
                    ...recentListTabBarOptions,
                    title: t('welcomepage.recentList')
                }}>
                { RecentListScreen }
            </WelcomePage.Screen>
            {
                calendarEnabled
            && <WelcomePage.Screen
                listeners = {{
                    tabPress: () => {
                        onSettingsScreenFocused(false);
                    }
                }}
                name = { screen.welcome.tabs.calendar }
                options = {{
                    ...calendarListTabBarOptions,
                    title: t('welcomepage.calendar')
                }}>
                { CalendarListScreen }
            </WelcomePage.Screen>
            }
             <WelcomePage.Screen
                listeners={{
                    tabPress: () => {
                        onSettingsScreenFocused(true);
                    },
                }}
                name={screen.settings.main}
                options={{
                    ...settingsTabBarOptions,
                    title: t("welcomepage.settings"),
                }}
            >
                {SettingsScreen}
            </WelcomePage.Screen>
            <WelcomePage.Screen
                listeners={{
                    tabPress: () => {
                        onSettingsScreenFocused(true);
                    },
                }}
                name={screen.integratedChat}
                options={{
                    ...chatTabBarOptions,
                    title: t("welcomepage.chat"),
                }}
            >
                {IntegratedChat}
            </WelcomePage.Screen>
        </WelcomePage.Navigator>
    );
};

  • This is my chat component:
const IntegratedChat = () => {

  useEffect(() => {
    var chatActivity = NativeModules.ChatActivity;
    chatActivity.open();

    return () => {
    };
  }, []);

  return (
    <View>
      
    </View>
  );
};
  • This is Chat module:
public class ChatActivityModule  extends ReactContextBaseJavaModule {
    public ChatActivityModule (ReactApplicationContext reactContext){
        super(reactContext);
    }

    @NonNull
    @Override
    public String getName() {
        return "ChatActivity";
    }

    @ReactMethod
    public void open(){
        Intent intent = new Intent(getCurrentActivity(), VectorMainActivity.class);
        getCurrentActivity().startActivity(intent);
    }
}

Also I have added singletask in main activity in the root of the manifest.

<activity ..
      android:launchMode= "singleTask" />

2

Answers


  1. adjust AndroidManifest.xml confirm that your chat activity is configured to launch in singleTask mode this prevents the creation of new instances every time the activity is accessed Your existing setup seems to be correct:

    <activity
    android:name=".VectorMainActivity"
    android:launchMode="singleTask" />
    

    modify your React Native Code update the code in your React Native chat module to handle the activity launch appropriately and instead of creating a new instance each time the chat button is pressed, check if the activity is already in the activity stack. If it is, bring it to the front.
    Here’s how you can implement this in your React Native chat module:

    @ReactMethod
    public void open() {
        Activity currentActivity = getCurrentActivity();
        if (currentActivity != null) {
            Intent intent = new Intent(currentActivity, VectorMainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            currentActivity.startActivity(intent);
        }
    }
    

    By making these adjustments, you ensure that tapping the chat button in your React Native app seamlessly brings the existing chat activity to the forefront, avoiding unnecessary instance creation.

    I hope these instructions are helpful for resolving your issue. Please feel free to reach out if you have any further questions. Additionally, forgive me if my explanation seems a bit technical—it’s my first time providing assistance on Stack Overflow.

    Login or Signup to reply.
  2. Activity, in a simple, is a top-level Android component, you cannot embed it inside another screen component. Your chat view should provide a View or Fragment component, and your React Native component should be able to embed one of these native components, not Activity.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search