Android.util.AndroidRuntimeException: requestFeature() необходимо вызвать перед добавлением содержимого

Я получаю эту ошибку android.util.AndroidRuntimeException: requestFeature() must be called before adding content. Как видно из приведенного ниже кода, строка requestWindowFeature(Window.FEATURE_NO_TITLE); предшествует строке setContentView(R.layout.mainmenu); кода. Этот код onCreate() является одним и тем же форматом почти во всех моих действиях, и до сих пор у меня никогда не было проблем с ним. С тех пор, как я обновился до 22 ADT, во всем мире появилось много случайных ошибок. Я пропустил множество ошибок, и это мой последний.

Что я могу сделать, чтобы исправить эту ошибку?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.mainmenu);

LogCat

05-31 04:20:43.121: E/AndroidRuntime(14559): FATAL EXCEPTION: main
05-31 04:20:43.121: E/AndroidRuntime(14559): java.lang.RuntimeException: Unable to start activity ComponentInfo{matt.lyons.bibletrivia.lite/matt.lyons.bibletrivia.lite.MainMenu}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.os.Looper.loop(Looper.java:137)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.main(ActivityThread.java:5041)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at java.lang.reflect.Method.invokeNative(Native Method)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at java.lang.reflect.Method.invoke(Method.java:511)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at dalvik.system.NativeStart.main(Native Method)
05-31 04:20:43.121: E/AndroidRuntime(14559): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:229)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Activity.requestWindowFeature(Activity.java:3244)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at matt.lyons.bibletrivia.lite.MainMenu.onCreate(MainMenu.java:28)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Activity.performCreate(Activity.java:5104)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-31 04:20:43.121: E/AndroidRuntime(14559):    ... 11 more

Ответ 1

Я также столкнулся с этой проблемой, но когда я вызываю запрос окна перед вызовом super.onCreate(), тогда проблема была решена, пожалуйста, попробуйте также.

@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainmenu);
}

Надеюсь, это поможет вам...:)


Отредактировано: для других возможных решений для новых версий Android

Скрыть строку состояния на Android 4.0 и ниже

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

Преимущества использования темы активности следующие:

  • Легче поддерживать и меньше подвергать ошибкам, чем устанавливать программный код.
  • Это приводит к более плавным переходам пользовательского интерфейса, потому что у системы есть информация, необходимая для визуализации вашего пользовательского интерфейса перед созданием основной активности вашего приложения.

Версия для Android ниже, чем Jellybean

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // If the Android version is lower than Jellybean, use this call to hide
    // the status bar.
    if (Build.VERSION.SDK_INT < 16) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    setContentView(R.layout.activity_main);
}

Скрыть строку состояния на Android 4.1 и выше

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

Обратите внимание на следующее:

  • После того, как флаги пользовательского интерфейса были очищены (например, путем перехода от активности), ваше приложение нуждается в reset, если вы хотите снова скрыть панели. См. Ответ на изменения видимости пользовательского интерфейса для обсуждения того, как прослушивать изменения видимости пользовательского интерфейса, чтобы ваше приложение могло соответственно реагировать.
  • Если вы устанавливаете флаги интерфейса, это имеет значение. Если вы спрячете системные бары в своей деятельности по методу onCreate(), и пользователь нажмет на Home, системные панели снова появятся. Когда пользователь снова открывает активность, onCreate() не будет вызван, поэтому системные панели останутся видимыми. Если вы хотите, чтобы изменения в системном пользовательском интерфейсе сохранялись, когда пользователь переходит в вашу активность и выходит из нее, установите флаги пользовательского интерфейса в onResume() или onWindowFocusChanged().
  • Метод setSystemUiVisibility() действует только в том случае, если вид, который вы вызываете из него, виден.
  • Отправляясь от представления, вы должны очистить флаги, установленные с помощью setSystemUiVisibility().

Ответ 2

Я получил это исключение (android.util.AndroidRuntimeException: requestFeature() must be called before adding content) при использовании

requestWindowFeature(Window.FEATURE_NO_TITLE);

на более старом устройстве под управлением Android 2.3.5 (Gingerbread). Я использую библиотеку поддержки v7.

Ошибка была исправлена, когда я изменил ее, чтобы использовать:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(Это происходит после моего вызова super.onCreate в исправлении тоже). См. Документы в https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)

Таким образом, это может быть скорее ошибочное сообщение об ошибке, чем что-либо еще.

Ответ 3

Если вы используете свою активность как диалог (с Theme.Dialog), убедитесь, что вы увеличиваете активность вместо ActionBarActivity (по умолчанию задано вам с помощью мастера Android Studio). Затем вы можете использовать

requestWindowFeature(Window.FEATURE_NO_TITLE);

или

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

ПОСЛЕ super.onCreate()...

Ответ 4

Пожалуйста, проверьте, что ваш класс распространяется от Activity или ActionBarActivity. Если вы используете ActionBarActivity, используйте Activity.

Ответ 5

Я расширял DialogFragment, и вышеупомянутый ответ didnot работы. Мне пришлось использовать getDialog(), чтобы удалить заголовок:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

Ответ 6

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowActionBar">false</item>

    </style>

Ответ 7

Я также столкнулся с этой ошибкой из другого рабочего процесса. Я создал собственный класс DialogFragment, и я создал две функции @Override - onCreateView и onCreateDialog. Моя функция onCreateView захватила пользовательский макет для фрагмента, а моя функция onCreateDialog создала AlertDialog.Builder.

Это, похоже, не работает, потому что onCreateDialog вызывается перед onCreateView. После того, как я удалил onCreateView [, переместив мой пользовательский вид инфляции в onCreateDialog, я столкнулся с ошибкой:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child parent first.

Я понял, что моя трудность связана с попыткой реализовать оба переопределения, поскольку я хотел: 1) использовать макет для основного вида диалога и 2) использовать предустановленные кнопки "Положительные/отрицательные" Builder. Мое решение состояло в том, чтобы создать положительные/отрицательные кнопки в моем пользовательском диалоговом окне, поэтому я удалил реализацию функции Override onCreateDialog.

Надеюсь, это поможет кому-то в будущем!

Вот несколько вопросов, которые помогли мне:

Ответ 8

Расширить (Активность) вместо ( ActionBarActivity)

пример: public class Itemdetails extends Activity {....

то в onCreate напишите:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);

Ответ 9

Я думаю, что самый простой способ сделать это - использовать этот ниже код

  getActionBar().setTitle(null);