android.util.AndroidRuntimeException: requestFeature () należy wywołać przed dodaniem zawartości

82

Otrzymuję ten android.util.AndroidRuntimeException: requestFeature() must be called before adding contentbłą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
Matt
źródło
Czy możesz rozwinąć? Nie wiem, co oznacza „przez temat”.
Matt
Możesz zastosować motyw w Manifeście pod tagiem aktywności, takim jak android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" zamiast pisać kod java w onCreate.
vishesh chandra

Odpowiedzi:

183

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:

  • Jest łatwiejszy w utrzymaniu i mniej podatny na błędy niż programowe ustawianie flagi.
  • Skutkuje to płynniejszymi przejściami interfejsu użytkownika, ponieważ system ma informacje potrzebne do renderowania interfejsu użytkownika przed utworzeniem wystąpienia głównej aktywności aplikacji.

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:

  • Po wyczyszczeniu flag interfejsu użytkownika (na przykład po opuszczeniu aktywności) aplikacja musi je zresetować, jeśli chcesz ponownie ukryć paski. Zobacz reagowanie na zmiany widoczności interfejsu użytkownika, aby zapoznać się z omówieniem sposobu nasłuchiwania zmian widoczności interfejsu użytkownika, aby aplikacja mogła odpowiednio reagować.
  • Miejsce ustawienia flag interfejsu użytkownika ma znaczenie. Jeśli ukryjesz paski systemowe w metodzie onCreate () działania, a użytkownik naciśnie przycisk Home, paski systemowe pojawią się ponownie. Gdy użytkownik ponownie otworzy działanie, onCreate () nie zostanie wywołany, więc paski systemowe pozostaną widoczne. Jeśli chcesz, aby zmiany w interfejsie systemu utrzymywały się podczas nawigacji użytkownika w ramach Twojej aktywności i poza nią, ustaw flagi interfejsu użytkownika w onResume () lub onWindowFocusChanged ().
  • Metoda setSystemUiVisibility () ma wpływ tylko wtedy, gdy widok, z którego ją wywołujesz, jest widoczny.
  • Odejście od widoku powoduje wyczyszczenie flag ustawionych za pomocą metody setSystemUiVisibility ().
vishesh chandra
źródło
3
@clu To requestFeature (int featureId) musi zostać wywołane przed setContentView (). Może być wywoływana dowolną liczbę razy, o ile występuje przed setContentView (). Jeśli nie zostanie wywołane, żadne rozszerzone funkcje nie będą dostępne. Nie można wyłączyć funkcji, gdy jest ona wymagana. Aby uzyskać więcej informacji, kliknij tutaj
vishesh chandra
2
Radziłbym requestWindowFeaturewcześniej dzwonić super.onCreate. Nie możesz mieć pewności co do stanu działania przed tym punktem.
vbence
@vishesh chandra czy możesz pomóc w moim przypadku to nie zadziałało stackoverflow.com/questions/27404146/…
Sasha
3
Rozwiązano problem, ale pasek tytułu nadal się pojawia.
Aritra Roy
Tak, dla mnie nadal pojawia się pasek akcji
Parthiban M
15

Mam ten wyjątek ( android.util.AndroidRuntimeException: requestFeature() must be called before adding content) podczas używania

requestWindowFeature(Window.FEATURE_NO_TITLE);

na 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:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(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.

gkee
źródło
1
U mnie też zadziałało. Używam ActionBarActivity z biblioteki wsparcia v21.
cybergen
1
Używam appCompati tak supportRequestWindowFeaturemi się udało i nie musiałem tego wcześniej umieszczaćsuper.onCreate
Max Koretskyi
pewnie, że to działało, ponieważ ten post ma 5 lat, ale tylko fyi: Window.FEATURE_INDETERMINATE_PROGRESS jest przestarzały od interfejsu API w porównaniu z 24
Adam R. Turner
7

Sprawdź, czy Twoja klasa jest rozszerzona z Activity lub ActionBarActivity. Jeśli używasz ActionBarActivity, użyj Activity.

haint
źródło
To był mój problem! Rozszerzałem AppCompatActivity, a requestWindowFeature (Window.FEATURE_NO_TITLE) nie powiodło się w ukrywaniu paska tytułu, dopóki nie przełączyłem się na rozszerzanie działania.
Casey Murray
7

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ć

requestWindowFeature(Window.FEATURE_NO_TITLE);

lub

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

PO super.onCreate()...

Coding4Fun
źródło
3

Napotkałem również ten błąd z innego przepływu pracy. Stworzyłem niestandardową klasę DialogFragment oraz dwie @Overridefunkcje - 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:

Nieudolny filozof
źródło
1
koleś, uratowałeś mi dzień! Dziękuję Ci! :)
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>

po prostu ustaw tylko taki styl, nie jest wymagana żadna zmiana strony kodowania.

Lalit kumar
źródło
1

Rozszerzałem DialogFragment i powyższa odpowiedź nie działa. Musiałem użyć getDialog (), aby usunąć tytuł:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Nielegalny argument
źródło
1

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);
Mohammed El-Sharnouby
źródło
0

Myślę, że najprostszym sposobem na to jest użycie poniższego kodu

  getActionBar().setTitle(null);
Hasan
źródło
0

Wypróbuj następujące opcje, przynajmniej jedna z nich powinna działać dla Ciebie:

  1. Jeśli używasz DialogFragment, spróbuj nie zastępować obu metod onCreateDialog(..)i onCreateView(..) (Ta zmiana zadziałała dla mnie)

  2. spróbuj supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)przed setContentView(..)zajęciami i po nichsuper.onCreate(..);

  3. Wypróbuj wcześniej opcję 2 super.onCreate(..);

Raj Kukadia
źródło
0

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);
Soumen Das
źródło
0

Miałem ten błąd z AlertDialogi błąd występował w API 19 tylko wtedy, gdydialog.show() został wywołany.

zorientowałem się, że android.app.AlertDialogimport powoduje problem, więc zmieniłem go na androidx.appcompat.app.AlertDialogi 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.

mohammad reza sarsarabi
źródło