android.util.AndroidRuntimeException: requestFeature () павінна быць выклікана перад даданнем змесціва

Я атрымліваю гэта android.util.AndroidRuntimeException: requestFeature() павінен выклікацца перад даданнем кантэнту памылка. Як вы можаце бачыць у прыведзеным ніжэй кодзе, 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
69
Вы можаце ўдакладніць? Я не ведаю, што «праз тэму» азначае.
дададзена аўтар Matt, крыніца
Вы можаце ўжыць тэму ў маніфесце пад тэгам актыўнасці, як, Android: тэма = "@ АНДРОІД: стыль/Theme.NoTitleBar.Fullscreen" замест напісання кода Java у OnCreate.
дададзена аўтар vishesh chandra, крыніца

9 адказы

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

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

Спадзяюся, што гэта дапаможа ... :)


<�Моцны> Рэдагавана: Для іншых магчымых рашэнняў для Android'd новых версій

<�Моцны> паказваць панэль стану на Android 4.0 і Lower


    ...

Перавагі выкарыстання ў тэму дзейнасці заключаюцца ў наступным:

  • Гэта прасцей у абслугоўванні і меней схільныя памылак, чым ўстаноўка сцяга праграмным спосабам.
  • Гэта прыводзіць да больш гладкім пераходах UI, таму што сістэма мае інфармацыю, якая патрабуецца, каб зрабіць ваш карыстацкі інтэрфейс, перш чым инстанцирование асноўнай дзейнасці вашага прыкладання.

<�Моцны> 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 змены бачнасці, так што ваша прыкладанне можа рэагаваць адпаведным чынам.
  • Калі вы ўсталявалі сцягі UI робіць розніцу. Калі схаваць сістэмныя бары ў метадзе вашай дзейнасці ў OnCreate() і карыстальнік націскае клавішу Home, сістэма бары з'явяцца зноў. Калі карыстальнік адкрывае нанова актыўнасць, OnCreate() не будзе выкліканы, таму сістэма бары застаюцца бачнымі. Калі вы жадаеце змены сістэмы карыстацкага інтэрфейсу захоўвацца як карыстальнік пераходзіць у і з вашай дзейнасці, ўсталёўваць сцягі інтэрфейсу ў onResume() або onWindowFocusChanged ().
  • Спосаб setSystemUiVisibility() дзейнічае толькі, калі выгляд вы выклікаеце яго ад бачная.
  • Пераход ад пункту гледжання выклікае сцягі, устаноўленыя з setSystemUiVisibility() павінен быць ачышчаны.
168
дададзена
Працаваў выдатна! :)
дададзена аўтар Matt, крыніца
Я б параіў супраць выкліку requestWindowFeature перад super.onCreate . Вы не можаце быць упэўненыя ў стане актыўнасці да гэтага моманту.
дададзена аўтар vbence, крыніца
Вырашана праблема, але па-ранейшаму з'яўляецца ў радку загалоўка.
дададзена аўтар Aritra Roy, крыніца
@clu Гэта <�б> requestFeature (ідэалам FeatureId) павінен быць выкліканы да setContentView (). Можа называцца колькі заўгодна разоў, пакуль яна перад setContentView (). Калі не выклікаецца, ня пашыраныя функцыі не будуць даступныя. Вы не можаце адключыць функцыю, калі ён запытваецца. Для больш падрабязнай інфармацыі націсніце тут
дададзена аўтар vishesh chandra, крыніца
Каб схаваць панэль дзеянняў, вы можаце выкарыстоўваць <�б> getActionbar() схаваць (); ... або <�б> getActivity() getActionbar() схаваць (); .
дададзена аўтар vishesh chandra, крыніца
Гэта працуе для мяне. Вы ведаеце, чаму гэта працуе? Гэта выпадковае дзярмо, як гэта, што зводзіць мяне з розуму аб распрацоўцы для Android.
дададзена аўтар clu, крыніца
Так, для мяне да гэтага часу з'яўляецца таксама панэль дзеянняў
дададзена аўтар Parthiban M, крыніца
Я таксама сутыкаюцца з той жа праблемай. Нават я спрабаваў, але змясціць радок перад super.onCreate ... Маё прыкладанне не разбілася, але не было ніякіх зменаў. Панэль дзеянняў была яшчэ бачная
дададзена аўтар Parthiban M, крыніца
@vishesh Чандра вы можаце дапамагчы ў маім выпадку гэта не працуе для мяне stackoverflow.com/questions/27404146/…
дададзена аўтар Sultan, крыніца

Я атрымаў гэта выключэнне ( android.util.AndroidRuntimeException: requestFeature() павінна выклікацца перад даданнем кантэнту ) пры выкарыстанні

requestWindowFeature(Window.FEATURE_NO_TITLE);

у старым прыладзе пад кіраваннем Android 2.3.5 (Gingerbread). Я выкарыстоўваю бібліятэку падтрымкі v7.

Была выпраўленая памылка, калі я змяніў яго выкарыстоўваць:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(This comes after my super.onCreate call in the fix, too). See docs at https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)

Так што можа быць больш выпадкі паведамленні пра памылку ў памылцы, чым усе астатняе.

12
дададзена
Я выкарыстоўваю AppCompat і таму supportRequestWindowFeature зрабіў трук для мяне, і я не павінен ставіць яго перад super.onCreate
дададзена аўтар AngularInDepth.com, крыніца
Працаваў таксама для мяне. Я выкарыстоўваю ActionBarActivity з бібліятэкі падтрымкі v21.
дададзена аўтар cybergen, крыніца

Калі вы выкарыстоўваеце вашу дзейнасць як дыялог (з Theme.Dialog), то пераканайцеся, што вы разьзяўляеце актыўнасць замест ActionBarActivity (па змаўчанні дадзена вам з дапамогай майстра Android студыі). Затым вы можаце выкарыстоўваць

requestWindowFeature(Window.FEATURE_NO_TITLE);

або

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

ПАСЛЯ super.onCreate() ...

7
дададзена

Калі ласка, праверце ваш клас распасцірацца ад дзейнасці або ActionBarActivity. Калі вы выкарыстоўваеце ActionBarActivity, калі ласка, выкарыстоўвайце актыўнасць.

7
дададзена
Гэта было маё пытанне! Я пашырэнне AppCompatActivity і requestWindowFeature (Window.FEATURE_NO_TITLE) не было паспяховым у хаваючы радок загалоўка, пакуль не перайшоў на пашырэнне актыўнасці.
дададзена аўтар Casey Murray, крыніца

<div class="snippet" data-lang="js" data-hide="false"> <div class="snippet-code">

 
</div> </div>

проста толькі задаць стыль, як гэта не патрабуецца якая-небудзь бок кадавання мяняецца.

2
дададзена
Гэта простае рашэнне, і выдатна працуе.
дададзена аўтар Bernard Choi, крыніца

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

Гэта, здавалася, не працуе, таму што onCreateDialog выклікаецца перад onCreateView. Пасля таго, як я выдаліў onCreateView [ссунуўшы мае карыстацкія інфляцыі віду ў onCreateDialog, я сутыкнуўся памылка:

<�Код> java.lang.IllegalStateException: Указаны дзіця ўжо мае бацькі. Вы павінны выклікаць removeView() на бацьку дзіцяці першым.

Я зразумеў, што мая цяжкасць прыйшла ад спробаў рэалізаваць абодва пераазначэння, так як я хацеў 1) выкарыстоўваць макет для галоўнага віду дыялогу, і 2) выкарыстоўваць Будаўнік наканаванага Адмоўныя кнопкі Станоўчай /. Маё рашэнне было стварыць станоўчыя/адмоўныя кнопкі ў маім дыялогу карыстацкіх гледжання, таму я выдаліў сваю рэалізацыю Перавызначыць onCreateDialog функцыі.

Спадзяюся, што гэта дапаможа каму-то ў будучыні!

Вось некаторыя SO пытанні, каторыя дапамаглі мне:

2
дададзена
чувак ты выратаваў мой дзень! Дзякуй! :)
дададзена аўтар Bassem Samy, крыніца

Я пашыраўся а <�моцны> DialogFragment і вышэй адказ didnot працы. Я павінен быў выкарыстоўваць getDialog (), каб выдаліць загаловак:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
1
дададзена

Падоўжыць (<�моцны> Дзейнасць ) замест (<�моцны> ActionBarActivity )

example: public class Itemdetails extends Activity {....

то ў OnCreate піша:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);
1
дададзена

я думаю, што самы просты спосаб зрабіць гэта з дапамогай гэтага кода ніжэй

  getActionBar().setTitle(null);
0
дададзена