2017-02-09 5 views
0

Почему нет AppCompatActivitygetFragmentManager() вернуть версию поддержки менеджера фрагментов? Вместо этого вы должны сделать свою деятельность AppCompatActivity И конкретно позвонить getSupportFragmentManager(). То же самое можно сказать и о десятках других методов. Мне кажется, что вам нужно волшебным образом узнать, какие методы вы можете назвать самими собой, и которые вы должны переименовать в качестве «поддержки». Существует ли какой-либо вариант использования для того, чтобы вызывать «нормальную» версию вместо «поддержки», когда вы по-прежнему поддерживаете более низкие версии Android? Для меня было бы намного больше смысла, если бы AppCompatActivity функционировал неотличимо от более поздних версий API Activity. В конце концов, это то, что нужно сделать, не так ли? Обеспечьте те же функции, что и более поздние версии API Activity?AppCompatActivity design

Есть ли какой-либо принцип дизайна или скрытое ограничение Java, которое мешает им это делать?

ответ

1

Почему GetFragmentManager() возвращает App-версию поддержки диспетчера фрагментов?

Потому что он не может.

Activity, на уровне API 11+, определяет getFragmentManager() как возвращающий android.app.FragmentManager. Единственный способ, которым AppCompatActivity мог бы переопределить его, - это если переопределенный метод также возвращает android.app.FragmentManager. Это невозможно. AppCompatActivity предназначен для возврата к уровню API 7, где нет возврата android.app.FragmentManager. Следовательно, мы имеем getSupportFragmentManager(), возвращая android.support.v4.app.FragmentManager.

Обратите внимание, что AppCompactActivity действительно получает свои фрагменты от FragmentActivity, который предназначен для работы с API уровня 4 за два года до уровня API 11 и собственных фрагментов.

+0

Почему бы не создать библиотеку поддержки собственной версии 'android.app.FragmentManager'? (Я предсказываю причины «то, что версия поддержки конфликтует с родной версией в более поздних API» или «соображениями безопасности». Но я не уверен.) – Erhannis

+0

@Erhannis: «Почему бы нет, например, библиотеки поддержки определить собственную версию android.app.FragmentManager? " - потому что тогда приложение, использующее библиотеку, выходит из строя на уровне API 11+, с конфликтующими реализациями 'android.app.FragmentManager'. – CommonsWare

+0

Хм. Я был бы удивлен, если бы не было сложного пути с помощью ClassLoaders и отражения, но я оставлю это. Другое решение, имеющееся для меня, было бы для них обладать подклассовой Activity, а не добавлять к ней методы, поэтому AppCompatActivity и Activity11 или что-то другое реализует getFragmentManager() со своей собственной версией FragmentManager. Я не могу сказать, что мне нравится этот подход; раздражающе неопрятный. Хорошо, я уступаю; Благодарю. Тем не менее, мне все равно не нравятся все методы поддержки; это тоже неопрятно. – Erhannis

 Смежные вопросы

  • Нет связанных вопросов^_^