Обновление заголовка ActionBar для Android Activity из обратной печати React Native Fragment

У меня есть функция React Native, встроенная в приложение для Android. Мне нужно обновить ActionBar Android Activity с экрана React Native. У меня это работает, используя мост и вызывая мост из файла js.

Я столкнулся с одной проблемой в течение некоторого времени, если я перехожу с одного экрана React Native Screen на другой и заголовок панели действий обновляется правильно, но если я использую «Кнопка назад» для возврата к предыдущему экрану, он не обновляет заголовок панели действий. Вот фрагмент кода:

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.

Кроме того, я использую StackNavigator из реакции-навигации, поэтому он предоставляет BackHandler, который отменяет нажатие кнопки возврата, но это не кажется правильным решением, я думаю, что один из методов жизненного цикла должен получать обратный вызов при нажатии кнопки возврата.

0
0
118
1

Ответы 1

Вместо настройки заголовка ActionBar в componentDidMount () теперь я использую 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 Ответ

Другие вопросы по теме