Я обновил SDK до последней версии (API 23), а метод onAttach(Activity)
для фрагмента устарел. Поэтому вместо использования этого метода теперь я использую onAttach(Context)
, но этот не вызывается в течение жизненного цикла. Действие представляет собой экземпляр AppCompatActivity
из v7, а фрагмент представляет собой экземпляр класса Fragment (android.app.Fragment
).
Любые идеи о том, как заставить onAttach
работать в API 23?
Решение
Я нашел несколько ответов, которые помогут вам понять и исправить эту проблему:
Для отображения фрагментов я получаю диспетчер фрагментов, используя метод getFragmentManager для активности, поэтому диспетчер фрагментов является экземпляром FragmentManager из android.app → и вот проблема
Если вы запустите приложение на устройстве с API 23 (Ive запустите его в AS Emulator), вы увидите, что будет вызван метод onAttach (Context). Во время процесса отображения фрагмента FragmentManager в определенный момент вызывается метод onAttach (..). Используя getFragmentManager(), вы получите экземпляр диспетчера фрагментов, доступный для версии Android, которая запущена на этом устройстве (например, API 22, 23). В случае, если приложение работает на устройстве с API < 23 метод onAttach (Контекст) недоступен, менеджер фрагментов не знает, что в API 23 существует метод onAttach (Context), поэтому поэтому он не вызывается для API < 23 → решение для подобных задач использует FragmentManager из библиотек поддержки.
Решения:
-
Использование getSupportFragmentManager() заставит вас использовать фрагмент из библиотеки поддержки. Итак, первое решение - заменить все фрагменты фрагментом из lib и использовать getSupportFragmentManager().
-
Решение, которое я уже реализовал, состоит в том, чтобы обрабатывать 2 возможности (1. приложение работает на устройстве с API < 23, приложение работает на устройстве с API >= 23).
Вкратце, в моей реализации у меня есть базовый класс для всех фрагментов из проекта, и я добавил туда этот код:
/*
* onAttach(Context) is not called on pre API 23 versions of Android and onAttach(Activity) is deprecated
* Use onAttachToContext instead
*/
@TargetApi(23)
@Override
public final void onAttach(Context context) {
super.onAttach(context);
onAttachToContext(context);
}
/*
* Deprecated on API 23
* Use onAttachToContext instead
*/
@SuppressWarnings("deprecation")
@Override
public final void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
/*
* Called when the fragment attaches to the context
*/
protected void onAttachToContext(Context context) {
}
Теперь я просто переопределяю метод onAttachToContext (Context) на всех фрагментах, где мне это нужно.