从React Native Fragment更新Android Activity的ActionBar标题,然后按

时间:2018-04-25 21:51:08

标签: android react-native

我在Android应用程序中嵌入了React Native功能。我需要从React Native Screen更新Android Activity的ActionBar。我通过使用Bridge并从js文件调用桥来实现此功能。

我现在面临一个问题,如果我从一个React Native屏幕导航到另一个并且Action栏标题正确更新,但是如果我使用" 后退按钮 "要返回上一个屏幕,它不会更新操作栏标题。以下是代码段:

Bridge.java

@ReactMethod
public void setActionBarTitle(String title) {
    final String actionBarTitle = title;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            final Activity activity = getCurrentActivity();
            activity.setTitle(actionBarTitle);
        }
    });
}

ReactScreen.js

componentDidMount() {
    NativeModules.ActivityStarter.setActionBarTitle(this.props.item.defectType)
}

我也尝试过使用componentWillReceiveProps(),但在Android中使用后退按钮时似乎没有得到回调。

另外,我正在使用来自react-navigation的StackNavigator,因此它提供BackHandler,它会覆盖后退按钮按下,但它似乎不是一个正确的解决方案,我认为其中一个生命周期方法应该得到一个回调在背面按下。

1 个答案:

答案 0 :(得分:0)

不是在componentDidMount()中设置ActionBar标题,而是使用导航器中的onNavigationStateChange(),并通过遍历状态来检测当前屏幕。

App.js

const App = () => (
    <Provider store={store}>
        <Navigator
            onNavigationStateChange={(prevState, currentState) => {
                if (Platform.OS === 'android') {
                    const prevScreen = this.findRouteNameFromNavigatorState(prevState);
                    const currentScreen = this.findRouteNameFromNavigatorState(currentState);
                    if (prevScreen !== currentScreen) {
                        this.setActionBarTitle(currentState, currentScreen);
                    }
                }
            }}
        />
    </Provider>
);

findRouteNameFromNavigatorState = (state) => {
    const route = this.getRoute(state);
    if (route !== undefined)
        return route.routeName;
};

参考:pensierinmusica Answer