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

Чи можете ви детальніше сказати? Я не знаю, що означає "наскрізна тема".
Matt

Ви можете застосувати тему в Manifest під тегом активності, наприклад, android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen", замість написання коду Java у onCreate.
vishesh chandra

Відповіді:


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

Зверніть увагу на таке:

  • Після того, як прапори інтерфейсу користувача буде очищено (наприклад, виходячи з активності), вашій програмі потрібно скинути їх, якщо ви хочете знову приховати смуги. Див. Відповідь на зміни видимості інтерфейсу, щоб обговорити, як прослуховувати зміни видимості інтерфейсу, щоб ваш додаток міг відповісти відповідно.
  • Там, де ви встановлюєте прапори інтерфейсу користувача, різниться. Якщо приховати системні рядки у методі onCreate () вашої діяльності, а користувач натисне кнопку Home, системні рядки знову з’являться. Коли користувач знову відкриє діяльність, onCreate () не буде викликаний, тому системні рядки залишаться видимими. Якщо ви хочете, щоб зміни користувальницького інтерфейсу не зникали, коли користувач переходить до вашої діяльності та виходить із неї, встановіть прапори інтерфейсу в onResume () або onWindowFocusChanged ().
  • Метод setSystemUiVisibility () діє лише у тому випадку, якщо вигляд, з якого ви його викликаєте, є видимим.
  • Відхід від подання призводить до очищення прапорів, встановлених за допомогою setSystemUiVisibility ().

3
@clu Цей requestFeature (int featureId) потрібно викликати перед setContentView (). Може викликатися скільки завгодно разів, скільки це було до setContentView (). Якщо не викликати, розширені функції не будуть доступні. Ви не можете вимкнути функцію, коли вона надіслана запит. Для більш детальної інформації натисніть тут
vishesh chandra

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

@vishesh chandra чи можете ви допомогти у моєму випадку, це не спрацювало для мене stackoverflow.com/questions/27404146/…
Саша

3
Вирішено проблему, але рядок заголовка все одно з'являється.
Aritra Roy

Так, для мене також все ще відображається панель дій
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.
кіберген

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

впевнений, це раніше працювало, оскільки цій публікації 5 років, але просто fyi: Window.FEATURE_INDETERMINATE_PROGRESS застаріло станом на api проти 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.

Сподіваюся, це допоможе комусь у майбутньому!

Ось декілька запитань SO, які мені допомогли:


1
чувак ти врятував мій день! Дякую! :)
Басем Вісса

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

Розширити ( 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.