Я обновил свое приложение, чтобы оно использовало последнюю версию библиотеки поддержки (версия 23.0.0), и обнаружил, что они не поддерживают функцию onAttach () класса Fragment.
Вместо того:
onAttach (Activity activity)
Это снег:
onAttach (Context context)
Поскольку мое приложение использует активность, переданную до устаревания, я думаю, что возможное решение:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
Это будет правильный способ сделать это?
ОБНОВИТЬ:
Если я запускаю устройство с API ниже 23, новый onAttach () даже не вызывается. Я надеюсь, что это не то, что они намеревались сделать!
ОБНОВЛЕНИЕ 2:
Проблема была решена с последними обновлениями в SDK.
Я проверил на своем устройстве API 22 и вызывается onAttach (Context).
Нажмите здесь, чтобы просмотреть отчет об ошибках, который я открыл пару недель назад, и ответы ребят из Google.
android
android-fragments
TareK Khoury
источник
источник
Context
? Разве вам не нужноActivity
, чтобы прикрепить и отобразить фрагмент в любом случае? Как еще вы будете использоватьContext
параметр?onAttach(Context context)
вам нужно либо использовать устройство с API по крайней мере 23, либо использовать android.support.v4.app.Fragment. Смотрите здесьОтветы:
Активность - это контекст, поэтому, если вы можете просто проверить, что контекст - это Активность, и при необходимости его разыграть.
Обновление: некоторые утверждают, что новое
Context
переопределение никогда не вызывается. Я провел несколько тестов и не могу найти сценарий, где это правда, и в соответствии с исходным кодом, это никогда не должно быть правдой. Во всех случаях я проверил, как до и после SDK23, обаActivity
иContext
версииonAttach
назывались. Если вы можете найти сценарий, в котором это не так, я бы предложил вам создать пример проекта, иллюстрирующий проблему, и сообщить об этом команде Android .Обновление 2: я использую только фрагменты библиотеки поддержки Android, так как ошибки там исправляются быстрее. Кажется, вышеупомянутая проблема, где переопределения не вызываются правильно, выявляется, только если вы используете фрагменты каркаса.
источник
onAttach(Context)
даже не кажетсяonAttach(context)
не вызван.Это еще один большой переход от Google ... Предложенная модификации: заменить
onAttach(Activity activity)
сonAttach(Context context)
разбившейся моими приложениями на старых API , так какonAttach(Context context)
не будет называться на родные фрагментах.Я использую нативные фрагменты (android.app.Fragment), поэтому мне пришлось сделать следующее, чтобы он снова работал на старых API (<23).
Вот что я сделал:
источник
Если вы используете фрагменты фреймворка и версия SDK устройства ниже 23,
OnAttach(Context context)
не будет вызвано.Вместо этого я использую вспомогательные фрагменты, поэтому устаревание исправлено и
onAttach(Context context)
всегда вызывается .источник
В настоящее время из
onAttach
фрагмента кода не ясно,Context
является ли текущая активность: Исходный кодЕсли вы посмотрите на
getActivity
вас, вы увидите тот же вызовТак что если вы хотите , чтобы убедиться , что вы получаете активность затем использовать
getActivity()
(вonAttach
в вашемFragment
) , но не забудьте проверить ,null
потому что , еслиmHost
этоnull
ваша деятельность будетnull
источник
источник
Хотя кажется, что в большинстве случаев этого достаточно
onAttach(Context)
, есть некоторые телефоны (например, Xiaomi Redme Note 2), где он не вызывается, поэтому он вызывает исключения NullPointerException. Поэтому, чтобы быть в безопасности, я предлагаю также оставить устаревший метод:источник
Загрузите новейшую библиотеку поддержки с менеджером SDK и включите
в gradle.app и установите версию компиляции на API 23
источник
Ответ ниже относится к этому предупреждению об устаревании, встречающемуся в учебном руководстве по фрагментам на веб-сайте разработчика Android, и может не относиться к постам выше.
Я использовал этот код на уроке, и он сработал.
Я волновался, что активность может быть нулевой, как указано в документации.
getActivity
FragmentActivity getActivity () Возвращает FragmentActivity, с которым в данный момент связан этот фрагмент. Может возвращать ноль, если вместо этого фрагмент связан с контекстом.
Но onCreate для main_activity четко показывает, что фрагмент был загружен, и поэтому после этого метода вызов действия get из фрагмента вернет класс main_activity.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
Я надеюсь, что я прав с этим. Я абсолютный новичок.
источник
Вы, вероятно, используете
android.support.v4.app.Fragment
. Для этого вместоonAttach
метода просто используйтеgetActivity()
для получения того,FragmentActivity
с чем связан фрагмент. Еще вы могли бы использоватьonAttach(Context context)
метод.источник
Это сработало для меня, когда у меня есть пользовательский интерфейс TopSectionListener, его объект действия коммандера:
источник