Intereting Posts
Потоковое аудио на http-post в Android OnRegistered () из GCMIntentService никогда не вызывал Как сделать ход для 3 сторон для формы в андроиде? Массив обнаруживает только часть из входного слова вместо всего слова UDP Hole Punching на Android; Сервер UDP Требуется ли versionCode / versionName в манифесте библиотеки? Onclick прослушиватель в android Android (ActionBarSherlock) Есть ли способ сохранить ту же самую высоту ActionBar как в портретной, так и в альбомной ориентации? Android setOnCheckedChangeListener снова звонит, когда возвращается старый вид Устройства Android GL_MAX_TEXTURE_SIZE ограничение, безопасный размер текстуры Настройка субтитров на панели инструментов из фрагмента Как повысить производительность с помощью обработки для Android? Условно установленная первая активность в Android Android нарисовать горизонтальную линию между видами Могу ли я использовать кнопку пожертвования PayPal в своем приложении для Android в Google Play?

Каков правильный способ справиться с устаревшими событиями фрагментов onAttach и onInflate

Я прочитал несколько статей и ответов (в том числе и этот ) относительно устаревшего кода, но я немного смущен относительно того, как обрабатывать (в частности) обработчик событий, устаревших Fragment onInflate .

Я заменил мою реализацию

 public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 

с

 public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) 

Если я запускаю свое приложение на машине <API23, код замены не вызывается.

Если я восстановил исходный устаревший код (так что теперь у меня есть оба метода), то вызывается устаревший код, правильная функциональность возвращается, но теперь выполняется вызов устаревшего метода (?).

И когда я запускаю приложение на машине API23, кажется, что вызывается BOTH-версия обработчика.

Итак, вопрос в том, что здесь происходит? Если я пишу код, который должен работать как на API23, так и на более ранних версиях, мне нужно реализовать устаревшие методы, а также новые?

И если это так, мне нужно выследить и реализовать другие устаревшие методы «на всякий случай»? (И, следовательно, есть список этих устаревших методов для «обратного кода» для?)


ОБНОВИТЬ :

Теперь я изменил использование android.app.Fragment в android.support.v4.app.Fragment (т. android.support.v4.app.Fragment Из собственных фрагментов для поддержки фрагментов), и теперь приложение выполняется так, как ожидалось, с кодом замены для всех версий и Как и ожидалось, переходит через источник андроида.

Но остается вопрос: ПОЧЕМУ ?

Почему появилась android.app.Fragment «native» android.app.Fragment ? Оглядываясь назад на более ранние вопросы, этот вопрос обсуждался еще в сентябре 2015 года. Так почему же это проблема? И почему должна быть разница в реализации поддержки и собственных фрагментов post API 11?

Solutions Collecting From Web of "Каков правильный способ справиться с устаревшими событиями фрагментов onAttach и onInflate"

Нет, вы не должны реализовывать

 public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 

Если метод устарел, вы можете (обычно) безопасно использовать функцию замены. Проверьте определения Фрагмента onInflate:

 public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { mCalled = true; final Activity hostActivity = mHost == null ? null : mHost.getActivity(); if (hostActivity != null) { mCalled = false; onInflate(hostActivity, attrs, savedInstanceState); } } @Deprecated public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { mCalled = true; } 

Как вы можете видеть, onInflate(Context context...) является расширением onInflate(Activity activity...) и обратно совместим. super.onInflate(context, attrs, savedInstanceState); Внутри вашего переопределенного метода вы можете с уверенностью предположить, что он будет работать как на API23, так и на более ранних версиях.

Если я запускаю свое приложение на машине <API23, код замены не вызывается.

Кажется странным, я не могу воспроизвести его, мой журнал выполняется с таким кодом, как на машине, отличной от v23:

 @Override public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { super.onInflate(context, attrs, savedInstanceState); Log.w(TAG, "I'm being executed"); } 

Убедись, что:

  1. Вы импортируете версию поддержки Fragment, android.support.v4.app.Fragment вместо android.app.Fragment и вы используете getSupportFragmentManager() вместо getFragmentManager() .
  2. У вас есть последние библиотеки support-v4 и appcompat-v7 а также compileSdkVersion 23 в вашем build.gradle

И когда я запускаю приложение на машине API23, кажется, что вызывается BOTH-версия обработчика.

Это можно объяснить onInflate(Context context...) , где, если он вызван действием, вызывает onInflate(Activity activity...)

РЕДАКТИРОВАТЬ

Что касается обновления:

Собственная реализация android.app.Fragment не должна быть обратно совместимой. Из-за этого код android.app.Fragment как правило, намного проще, чем у android.support.v4.app.Fragment .

Кроме того, есть некоторые особенности встроенной реализации, которые не могут быть внедрены в библиотеку поддержки либо потому, что это сложно по дизайну, либо потому, что это не приоритет для разработчиков. Например, в исходной реализации в исходном коде onInflate () используется переход для анимации входа или выхода нового фрагмента. Этого нигде не найти в библиотеке поддержки.