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().