Intereting Posts

Каков правильный способ справиться с устаревшими событиями фрагментов 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?

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

 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 () используется переход для анимации входа или выхода нового фрагмента. Этого нигде не найти в библиотеке поддержки.