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