#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