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)

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

gkee
источник
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()...

Coding4Fun
источник
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.

Мохаммад Реза Сарсараби
источник