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


82

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

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

@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

Вы можете уточнить? Я не знаю, что значит «через тему».
Мэтт

Вы можете применить тему в манифесте в теге активности, например, android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" вместо написания кода Java в onCreate.
вишеш чандра 05

Ответы:


183

Я также столкнулся с этой проблемой, но когда я вызываю запрос окна перед вызовом 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();

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

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

3
@clu Этот requestFeature (int featureId) должен вызываться перед setContentView (). Может вызываться столько раз, сколько нужно, до тех пор, пока он находится до setContentView (). Если не вызвать, никакие расширенные функции не будут доступны. Вы не можете отключить функцию после того, как она будет запрошена. Для более подробной информации нажмите здесь
вишеш чандра

2
Я бы не советовал звонить requestWindowFeatureраньше super.onCreate. Вы не можете быть уверены в состоянии Activity до этого момента.
vbence 02

@vishesh chandra, не могли бы вы помочь в моем случае, это не сработало для меня stackoverflow.com/questions/27404146/…
Саша

3
Проблема решена, но строка заголовка все еще отображается.
Аритра Рой

Да, у меня также все еще появляется панель действий
Parthiban M

15

Я получил это исключение ( 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)

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


1
Работал и у меня. Я использую ActionBarActivity из библиотеки поддержки v21.
cybergen

1
Я использую, appCompatи это supportRequestWindowFeatureпомогло мне, и мне не нужно было ставить его раньшеsuper.onCreate
Макс Корецкий

конечно, это работало, так как этому сообщению 5 лет, но просто к сведению: Window.FEATURE_INDETERMINATE_PROGRESS устарел с api vs. 24
Адам Р. Тернер

7

Убедитесь, что ваш класс является наследником Activity или ActionBarActivity. Если вы используете ActionBarActivity, используйте Activity.


Это была моя проблема! Я расширял AppCompatActivity, и requestWindowFeature (Window.FEATURE_NO_TITLE) не смог скрыть строку заголовка, пока я не переключился на расширение Activity.
Кейси Мюррей

7

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

requestWindowFeature(Window.FEATURE_NO_TITLE);

или же

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

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


3

Я также столкнулся с этой ошибкой из-за другого рабочего процесса. Я создал собственный класс 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's parent first.

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

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

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


1
чувак, ты спас мне день! Спасибо! :)
Bassem Wissa

2

 <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>

просто установите такой стиль, никакое изменение стороны кодирования не требуется.


1

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

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

1

Extend ( Activity ) вместо ( ActionBarActivity )

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

затем в onCreate напишите:

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

0

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

  getActionBar().setTitle(null);

0

Попробуйте следующие варианты, хотя бы один из них должен вам подойти:

  1. Если вы используете DialogFragment, попробуйте не переопределять оба метода onCreateDialog(..)и onCreateView(..) (это изменение сработало для меня)

  2. пробовать supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)до setContentView(..)в деятельности и послеsuper.onCreate(..);

  3. Попробуйте вариант 2 раньше super.onCreate(..);


0

Неуместно ваша строка: super.onCreate (savedInstanceState);

используйте этот способ:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrscanner);

0

У меня была эта ошибка, AlertDialogи ошибка возникала в API 19 только тогда, когдаdialog.show() вызове.

выяснил, что android.app.AlertDialogимпорт вызывает проблему, поэтому я изменил его на androidx.appcompat.app.AlertDialogи исправил.

Обратите внимание, что это будет работать, если вы используете androidx. в противном случае вам следует использовать старую версию этого импорта appcompat.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.