RequestFeature() необходимо вызвать перед добавлением содержимого в фрагмент
android.util.AndroidRuntimeException: requestFeature() must be called before adding content
Я получаю эту ошибку, когда я использую
getActivity().getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
из фрагмента.
Я хочу изменить стиль действия только в этом фрагменте. Поэтому я не могу установить это в MainActivity
. Как это решить?
Я видел этот вопрос requestFeature() должен быть вызван перед добавлением содержимого, он не говорит, как решить эту проблему из фрагмента
Ответы
Ответ 1
Независимо от того, что люди отвечают, эти проблемы все еще появляются, если вы используете AppCompatActivity в качестве родителя для своей деятельности.
Для меня этот код вызывает ошибку:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.activity_browser);
}
- Тест 1:
MyActivity extends Activity
== > Работал
- Тестирование 2:
MyActivity extends AppCompatActivity
== > Ошибка "requestFeature() необходимо вызвать перед добавлением содержимого в действие"
Решение для теста 2 (если вы используете Appcompat) - это вызов requestFeature
до super.onCreate
. Это решит вашу проблему.
Ответ 2
Вы должны вызвать getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
до setContentView()
в методе Activity onCreate()
. Вы должны добавить эту строку в свой FragmentActivity
, из которого вызывается ваш Fragment
.
Ответ 3
requestFeature()
должен быть вызван до setContentView()
в вашей деятельности.
Вызов getActivity().getWindow().requestFeature()
из фрагмента - это плохая практика. Если вы хотите, чтобы видимость вашей панели действий была отложена, я рекомендую скрыть панель действий в onCreate()
вашей деятельности и отобразить ее в onViewCreated()
в вашем фрагменте.
Ответ 4
Вам нужно создать отдельное действие для этого фрагмента, а затем requestFeature() для этого действия перед setContentView(), потому что requestFeature() является методом android.view.Window. Функции окна предназначены для конкретной деятельности. Вы можете манипулировать поведениями окна для определенного действия, а не определенного фрагмента.
Ответ 5
Я также получил эту ошибку, работая с DialogFragment, хотя я вообще не вызывал requestFeature().
Я вызывал getDecorView() из DialogFragment onActivitiyCreate() как часть некоторого кода трассировки, который я написал, чтобы помочь мне понять, как и когда создаются Windows. Это сработало хорошо, но чуть позже в жизненном цикле фрагмента был вызван его метод onStart(). Это называется диалоговое окно(), которое в конечном итоге называется AlertDialog onCreate(), которое в конечном итоге вызвало метод PhoneWindow requestFeature() для запроса Window.FEATURE_NO_TITLE.
Так как вызов getDecorView() "впервые" блокирует "различные характеристики окна, как описано в setContentView (View, android.view.ViewGroup.LayoutParams)", это нарушило требование, чтобы "requestFeature() вызывается до добавление контента во Фрагмент" - тонкость заключалась в том, что контент добавлялся косвенно моим вызовом getDecorView().
Исправление заключалось в вызове peekDecorView() вместо getDecorView().