Обратный вызов не срабатывает после поворота экрана

#android

#Android

Вопрос:

у меня есть follow (https://developer.android.com/reference/androidx/activity/OnBackPressedDispatcher)

 @Override
public void onAttach(@NonNull final Context context)
{
    super.onAttach(context);
    final OnBackPressedCallback _fra&mentOnBackPressedCallback = new OnBackPressedCallback(true)
    {
        @Override
        public void handleOnBackPressed()
        {
            sendData();
        }
    };
    requireActivity().&etOnBackPressedDispatcher().addCallback(this, _fra&mentOnBackPressedCallback);
}
  

в моей деятельности в onCreate я делаю

 final OnBackPressedCallback callback = new OnBackPressedCallback(true)
        {
            @Override
            public void handleOnBackPressed()
            {
                if(&etSupportFra&mentMana&er().&etBackStackEntryCount() &&t;= 1)
                    &etSupportFra&mentMana&er().popBackStack();
                else
                    navi&ateUpInMenu();
            }
        };
        &etOnBackPressedDispatcher().addCallback(this, callback);
}
  

Это отлично работает, но когда я поворачиваю телефон, метод sendData не вызывается. Я что-то пропустил?
Я использую androidx.активность:активность:1.1.0

Комментарии:

1. Есть ли у вас какие-либо другие OnBackPressedCallback зарегистрированные вами экземпляры? Например, какой-либо зарегистрированный с использованием жизненного цикла действия?

2. Какой-то другой фрагмент выполняет тот же код. И основная активность

3. Можете ли вы включить этот код из своего, MainActivity который также использует OnBackPressedCallback ?

Ответ №1:

Я думаю, вам следовало OnBackPressedCallback зарегистрироваться до тех пор, пока жив View или viewLifecycleOwner фрагмент.

viewLifeCycleOwner находится между onCreateView и onDestroyView , поэтому вам также не нужно отменять регистрацию обратного вызова, чтобы предотвратить любую потенциальную утечку памяти из-за жизненного цикла фрагмента.

Я использую

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)

}

    val callback = object : OnBackPressedCallback(false) {

        override fun handleOnBackPressed() {
             sendData()
       }
   }
  

С помощью свойства обратного вызова вы также можете включить или отключить его в зависимости от некоторых условий или событий жизненного цикла.

 override fun onResume() {
    super.onResume()
    callback.isEnabled = true
}

override fun onPause() {
    super.onPause()
    callback.isEnabled = false
}
  

Ответ №2:

У меня была такая же проблема, и я решил ее с помощью некоторых советов выше. Проблема для меня заключалась в том, что я регистрировался onBackPressedDispatcher как из моих фрагментов, так и из моей MainActivity.

До недавних обновлений Android я использовал onBackPressed() в своем MainActivity, чтобы скрыть ящик перед выходом из приложения, и onBackPressedDispatcher в своих фрагментах, чтобы запросить у пользователя подтверждение перед возвратом назад. Этот подход отлично сработал. Теперь, onBackPressed() in Activities устарел и onBackPressedDispatcher рекомендуется использовать вместо него. Это также работало нормально, пока вы не повернете дисплей, и внезапно нажатие Fra&ment back игнорируется, а вместо этого выполняется код обратного нажатия MainActivity. Я не знаю, ошибка это или нет, но я буду избегать его использования.

Я исправил проблему, переместив onBackPressedDispatcher код из моей MainActivity в первый «Основной» фрагмент. Таким образом, обратные нажатия контролируются только фрагментами, что в моем случае означает, что только один элемент одновременно отвечает за управление поведением обратного нажатия.

Ответ №3:

Согласно официальной документации

onAttach (Activity) вызывается, как только фрагмент связан с его активностью.

Хорошая вещь, которую нужно сделать, это переместить onBackPressedDispatcher в onViewCreated