Обновить заголовок ActionBar для Android Activity из React Native Fragment назад нажмите - PullRequest
0 голосов
/ 26 апреля 2018

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

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

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, который переопределяет нажатие кнопки назад, но это не кажется правильным решением, я думаю, что один из методов жизненного цикла должен получитьобратный вызов при обратном нажатии.

1 Ответ

0 голосов
/ 01 мая 2018

Вместо того, чтобы устанавливать заголовок 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 Ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...