Otrzymuję ten android.util.AndroidRuntimeException: requestFeature() must be called before adding content
błąd. Jak widać w poniższym kodzie, requestWindowFeature(Window.FEATURE_NO_TITLE);
linia znajduje się przed setContentView(R.layout.mainmenu);
linią kodu. Ten kod onCreate () ma ten sam format w prawie każdym z moich działań i nigdy wcześniej nie miałem z nim problemów. Odkąd zaktualizowałem do ADT 22, wszędzie pojawiało się wiele przypadkowych błędów. Pozbyłem się wielu z tych błędów i to jest mój ostatni.
Co mogę zrobić, aby naprawić ten błąd?
@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
Odpowiedzi:
Ja również napotkałem ten problem, ale kiedy wywołuję żądanie okna przed wywołaniem super.onCreate (), problem został rozwiązany, spróbuj również tak, jak ...
@Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.mainmenu); }
Mam nadzieję, że to ci pomoże ... :)
Edytowano: inne możliwe rozwiązania dla nowych wersji Androida
Ukryj pasek stanu w systemie Android 4.0 i niższych
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ... </application>
Zalety korzystania z motywu działania są następujące:
Wersja Androida jest niższa niż 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); }
Ukryj pasek stanu w systemie Android 4.1 i nowszych
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();
Zwróć uwagę na następujące kwestie:
źródło
requestWindowFeature
wcześniej dzwonićsuper.onCreate
. Nie możesz mieć pewności co do stanu działania przed tym punktem.Mam ten wyjątek (
android.util.AndroidRuntimeException: requestFeature() must be called before adding content
) podczas używaniana starszym urządzeniu z systemem Android 2.3.5 (Gingerbread). Używam biblioteki obsługi wersji 7.
Błąd został naprawiony, gdy zmieniłem go na:
(To jest również po moim wywołaniu super.onCreate w poprawce). Zobacz dokumenty na https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)
Więc może to być bardziej mylący komunikat o błędzie niż cokolwiek innego.
źródło
appCompat
i taksupportRequestWindowFeature
mi się udało i nie musiałem tego wcześniej umieszczaćsuper.onCreate
Sprawdź, czy Twoja klasa jest rozszerzona z Activity lub ActionBarActivity. Jeśli używasz ActionBarActivity, użyj Activity.
źródło
Jeśli używasz swojego działania jako okna dialogowego (z Theme.Dialog), upewnij się, że rozszerzasz działanie zamiast ActionBarActivity (wartość domyślna nadawana za pomocą kreatora Android Studio). Następnie możesz użyć
lub
PO
super.onCreate()
...źródło
Napotkałem również ten błąd z innego przepływu pracy. Stworzyłem niestandardową klasę DialogFragment oraz dwie
@Override
funkcje - onCreateView i onCreateDialog. Moja funkcja onCreateView pobrała niestandardowy układ dla fragmentu, a moja funkcja onCreateDialog utworzyła AlertDialog.Builder.Wydaje się, że nie działa, ponieważ onCreateDialog jest wywoływany przed onCreateView. Po usunięciu onCreateView [poprzez przeniesienie inflacji widoku niestandardowego do onCreateDialog napotkałem błąd:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Zdałem sobie sprawę, że moja trudność wynikała z próby zaimplementowania obu zastąpień, ponieważ chciałem 1) użyć układu głównego widoku okna dialogowego oraz 2) użyć wstępnie zdefiniowanych przycisków Pozytyw / Negatyw Konstruktora. Moim rozwiązaniem było utworzenie przycisków dodatnich / ujemnych w moim niestandardowym widoku okna dialogowego, więc usunąłem implementację funkcji Override onCreateDialog.
Mam nadzieję, że to pomoże komuś w przyszłości!
Oto kilka pytań SO, które mi pomogły:
źródło
<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>
po prostu ustaw tylko taki styl, nie jest wymagana żadna zmiana strony kodowania.
źródło
Rozszerzałem DialogFragment i powyższa odpowiedź nie działa. Musiałem użyć getDialog (), aby usunąć tytuł:
źródło
Extend ( Activity ) zamiast ( ActionBarActivity )
przykład:
public class Itemdetails extends Activity {....
następnie w onCreate napisz:
super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.Your_Activity);
źródło
Myślę, że najprostszym sposobem na to jest użycie poniższego kodu
getActionBar().setTitle(null);
źródło
Wypróbuj następujące opcje, przynajmniej jedna z nich powinna działać dla Ciebie:
Jeśli używasz DialogFragment, spróbuj nie zastępować obu metod
onCreateDialog(..)
ionCreateView(..)
(Ta zmiana zadziałała dla mnie)spróbuj
supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)
przedsetContentView(..)
zajęciami i po nichsuper.onCreate(..);
Wypróbuj wcześniej opcję 2
super.onCreate(..);
źródło
Zgubiony wiersz: super.onCreate (saveInstanceState);
użyj tego sposobu:
@Override protected void onCreate(Bundle savedInstanceState) { this.requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_qrscanner);
źródło
Miałem ten błąd z
AlertDialog
i błąd występował w API 19 tylko wtedy, gdydialog.show()
został wywołany.zorientowałem się, że
android.app.AlertDialog
import powoduje problem, więc zmieniłem go naandroidx.appcompat.app.AlertDialog
i naprawiłem.Pamiętaj, że to zadziała, jeśli używasz Androidax. jeśli nie, powinieneś użyć starej wersji tego importu zgodnej z aplikacjami.
źródło