Android Fragment onAttach () устарел

Я обновил мое приложение, чтобы использовать самую последнюю библиотеку поддержки (версия 23.0.0), я выяснил, что они не рекомендовали функцию onAttach () classа 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.

Активность – это контекст, поэтому, если вы можете просто проверить, что контекст – это Activity, и при необходимости произведите его.

 @Override public void onAttach(Context context) { super.onAttach(context); Activity a; if (context instanceof Activity){ a=(Activity) context; } } 

Обновление: некоторые утверждают, что новое переопределение Context никогда не вызывается. Я сделал несколько тестов и не могу найти сценарий, где это правда, и в соответствии с исходным кодом он никогда не должен быть правдой. Во всех случаях, которые я тестировал, как pre, так и post SDK23, вызывались как Activity и Context версии onAttach . Если вы можете найти сценарий, где это не так, я бы предложил вам создать образец проекта, иллюстрирующий проблему, и сообщить об этом команде Android .

Обновление 2: я использую только fragmentы библиотеки поддержки Android, так как там быстрее исправляются ошибки. Похоже, что вышеупомянутая проблема, когда переопределения не вызываются правильно, только обнаруживается, если вы используете fragmentы фреймворка.

Это еще одно отличное изменение от Google … Предлагаемая модификация: заменить onAttach(Activity activity) на onAttach(Context context) разбила мои приложения на более старые API, так как onAttach(Context context) не будет вызываться на нативных fragmentах.

Я использую собственные fragmentы (android.app.Fragment), поэтому мне пришлось сделать следующее, чтобы снова работать над старыми API (<23).

Вот что я сделал:

 @Override public void onAttach(Context context) { super.onAttach(context); // Code here } @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // Code here } } 

Если вы используете fragmentы фреймворка и версия SDK устройства ниже 23, OnAttach(Context context) не будет вызываться.

Вместо этого я использую fragmentы поддержки, поэтому исправление устарело и onAttach(Context context) .

В настоящее время из onAttach fragmentа onAttach , является ли Context текущей деятельностью: исходный код

 public void onAttach(Context context) { mCalled = true; final Activity hostActivity = mHost == null ? null : mHost.getActivity(); if (hostActivity != null) { mCalled = false; onAttach(hostActivity); } } 

Если вы посмотрите на getActivity вы увидите тот же звонок

 /** * Return the Activity this fragment is currently associated with. */ final public Activity getActivity() { return mHost == null ? null : mHost.getActivity(); } 

Поэтому, если вы хотите быть уверенным, что получаете активность, используйте getActivity()onAttach в своем Fragment ), но не забудьте проверить значение null потому что если mHost имеет значение null ваша активность будет равна null

 @Override public void onAttach(Context context) { super.onAttach(context); Activity activity = context instanceof Activity ? (Activity) context : null; } 

Загрузите новейшую библиотеку поддержки с помощью менеджера sdk и включите

 compile 'com.android.support:appcompat-v7:23.1.1' 

в gradle.app и установите версию компиляции в api 23

Нижеприведенный ответ связан с этим предупреждением об устаревании, которое встречается в учебнике «Фрагменты» на веб-сайте разработчика Android и не может быть связано с сообщениями выше.

Я использовал этот код на уроке урока, и это сработало.

 public void onAttach(Context context){ super.onAttach(context); Activity activity = getActivity(); 

Я был обеспокоен тем, что активность может быть нулевой, как указано в документации.

getActivity

FragmentActivity getActivity () Возвращает FragmentActivity, с которым в данный момент связан этот fragment. Может возвращать значение null, если fragment связан с контекстом.

Но onCreate on main_activity ясно показывает, что fragment был загружен, и поэтому после этого метода вызов функции get из fragmentа вернет class main_activity.

getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();

Надеюсь, я прав. Я абсолютный новичок.

вы, вероятно, используете android.support.v4.app.Fragment . Для этого вместо метода onAttach просто используйте getActivity() чтобы получить FragmentActivity с которым связан fragment. Кроме того, вы можете использовать onAttach(Context context) .

Хотя кажется, что в большинстве случаев достаточно иметь onAttach(Context) , есть некоторые телефоны (например, Xiaomi Redme Note 2), где он не вызывается, поэтому он вызывает NullPointerExceptions. Поэтому, чтобы быть в безопасности, я предлагаю также отказаться от устаревшего метода:

 // onAttach(Activity) is necessary in some Xiaomi phones @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); _onAttach(activity); } @Override public void onAttach(Context context) { super.onAttach(context); _onAttach(context); } private void _onAttach(Context context) { // do your real stuff here } 
  • getView возвращает null, когда fragment был создан из действия
  • Как обрабатывать backPress с помощью fragmentа
  • Не удалось импортировать новый проект Gradle в андроид-студию
  • Новый Intent () запускает новый экземпляр с Android: launchMode = "singleTop"
  • Как скомпилировать Android-приложение с системными правами
  • Фатальный сигнал 11 (SIGSEGV) при 0x00000000 (код = 1) - PhoneGap
  • Каковы различия между активностью и fragmentом
  • Android: доступ к файлу базы данных sqlite для файлов с расширением .sqlite
  • Регулятор громкости в приложении android
  • Это приложение не будет запущено, если вы не обновите сервисы Google Play (через Bazaar)
  • Установка максимальной ширины в ViewGroup
  • Interesting Posts

    Что случилось с моими «предопределенными правилами» в брандмауэре Windows? Как я могу вернуть их?

    Почему статические методы не используются в качестве веб-служб в веб-службах ASMX?

    HTML Canvas, положение мыши после масштабирования и перевода

    Лучший способ переключить поведение, основанное на типе

    Как включить (буквально) ВСЕ предупреждения GCC?

    Могут ли файлы AVI содержать вирус?

    Почему клонированный Windows 7 BCD содержит неполные данные (и, следовательно, предотвращает загрузку)?

    Android Seekbar с двумя большими пальцами

    Как получить сетевую статистику в реальном времени в Linux с помощью формата KB / MB / Bytes и для конкретного идентификатора процесса или порта

    как я могу получить случайную базу данных Firebase

    Если вы используете VPN, мой интернет-провайдер сможет читать мой интернет-трафик?

    Отключить анимацию ячеек Excel 2013

    MVC 3 jQuery Проверка / глобализация числа / десятичного поля

    Что такое IDL?

    Windows7: изменение ярлыка Backshift в проводнике назад?

    Давайте будем гением компьютера.