android.util.AndroidRuntimeException: requestFeature () içerik eklemeden önce çağrılmalıdır


82

Bu android.util.AndroidRuntimeException: requestFeature() must be called before adding contenthatayı alıyorum. Aşağıdaki kodda görebileceğiniz gibi, requestWindowFeature(Window.FEATURE_NO_TITLE);satır kod satırından önce gelir setContentView(R.layout.mainmenu);. Bu onCreate () kodu, etkinliklerimin hemen hemen her birinde aynı formatta ve şimdiye kadar onunla hiç sorun yaşamadım. ADT 22'ye güncellediğimden beri her yerde birçok rastgele hata ortaya çıkıyor. Bu hataların çoğunu ayıkladım ve bu benim sonuncusu.

Bu hatayı düzeltmek için ne yapabilirim?

@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

Detaylandırır mısın "Tema yoluyla" ne demek bilmiyorum.
Matt

Temayı Manifest'te , onCreate'e java kodu yazmak yerine android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" gibi etkinlik etiketi altında uygulayabilirsiniz .
vishesh chandra

Yanıtlar:


183

Ben de bu problemle karşılaştım ama super.onCreate () ' i aramadan önce window request'i çağırdığımda problem çözüldü, lütfen aynı şekilde deneyin ..

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

Umarım bu size yardımcı olur ... :)


Düzenlendi: Android'in yeni sürümlerine yönelik diğer olası çözümler için

Durum Çubuğunu Android 4.0 ve Altında Gizleyin

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

Aktivite teması kullanmanın avantajları aşağıdaki gibidir:

  • Bir bayrağı programlı olarak ayarlamaktan daha kolay ve daha az hataya açıktır.
  • Sistem, uygulamanızın ana etkinliğini somutlaştırmadan önce kullanıcı arayüzünüzü oluşturmak için ihtiyaç duyduğu bilgilere sahip olduğundan, daha yumuşak UI geçişleri sağlar.

Android sürümü Jellybean'dan daha düşük

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

Durum Çubuğunu Android 4.1 ve Üstünde Gizleyin

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

Aşağıdakilere dikkat et:

  • Kullanıcı arayüzü bayrakları temizlendikten sonra (örneğin, etkinlikten uzaklaşarak), çubukları tekrar gizlemek istiyorsanız uygulamanızın bunları sıfırlaması gerekir. Uygulamanızın uygun şekilde yanıt verebilmesi için kullanıcı arayüzü görünürlüğü değişikliklerini nasıl dinleyeceğinize ilişkin bir tartışma için Kullanıcı Arayüzü Görünürlük Değişikliklerine Yanıt Verme konusuna bakın .
  • UI bayraklarını ayarladığınız yer fark yaratır. Aktivitenizin onCreate () yönteminde sistem çubuklarını gizlerseniz ve kullanıcı Home'a ​​basarsa, sistem çubukları yeniden görünecektir. Kullanıcı etkinliği yeniden açtığında, onCreate () çağrılmaz, bu nedenle sistem çubukları görünür kalır. Kullanıcı etkinliğinize girip çıkarken sistem UI değişikliklerinin devam etmesini istiyorsanız, onResume () veya onWindowFocusChanged () 'de UI bayraklarını ayarlayın.
  • SetSystemUiVisibility () yöntemi yalnızca onu çağırdığınız görünüm görünür durumdaysa bir etkiye sahiptir.
  • Görünümden uzaklaşmak setSystemUiVisibility () ile ayarlanan bayrakların temizlenmesine neden olur.

3
@clu Bu requestFeature (int featureId) setContentView () 'dan önce çağrılmalıdır. SetContentView () 'dan önce olduğu sürece istenildiği kadar çok çağrılabilir. Çağrılmazsa, genişletilmiş özellikler kullanılamayacaktır. İstendiğinde bir özelliği kapatamazsınız. Daha fazla ayrıntı için buraya tıklayın
vishesh chandra

2
Daha requestWindowFeatureönce aramamanı tavsiye ederim super.onCreate. O noktadan önce Faaliyetin durumundan emin olamazsınız.
vbence

@vishesh chandra benim durumumda yardımcı olabilir misiniz, bu benim için işe yaramadı stackoverflow.com/questions/27404146/…
Sasha

3
Sorun çözüldü, ancak başlık çubuğu hala görünüyor.
Aritra Roy

Evet, benim için eylem çubuğu hala görünüyor
Parthiban M

15

android.util.AndroidRuntimeException: requestFeature() must be called before adding contentKullanırken bu istisnayı ( ) aldım

requestWindowFeature(Window.FEATURE_NO_TITLE);

Android 2.3.5 (Gingerbread) çalıştıran eski bir cihazda. V7 destek kitaplığını kullanıyorum.

Kullanmak için değiştirdiğimde hata düzeltildi:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(Bu, düzeltmedeki super.onCreate çağrımdan sonra da gelir). Https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int) adresindeki belgelere bakın

Bu nedenle, her şeyden çok yanıltıcı bir hata mesajı durumu olabilir.


1
Benim için de çalıştı. Destek kitaplığı v21'den ActionBarActivity kullanıyorum.
cybergen

1
Ben kullanıyorum appCompatve bu yüzden supportRequestWindowFeaturebenim için hile yaptı ve daha önce koymak yoktusuper.onCreate
Max Koretskyi

bunun eskiden bu gönderi 5 yıldan beri işe yaradığından emin olun, ancak sadece şunu unutmayın: Window.FEATURE_INDETERMINATE_PROGRESS, api ile 24
Adam R. Turner

7

Lütfen sınıfınızın Activity veya ActionBarActivity'den genişletilip genişletilmediğini kontrol edin. ActionBarActivity kullanıyorsanız, lütfen Activity'i kullanın.


Bu benim sorunumdu! AppCompatActivity'yi genişletiyordum ve requestWindowFeature (Window.FEATURE_NO_TITLE), Activity'i genişletmeye geçene kadar başlık çubuğunu gizlemede başarılı olamadı.
Casey Murray

7

Aktivitenizi bir İletişim Kutusu olarak (Theme.Dialog ile) kullanıyorsanız, ActionBarActivity (Android Studio sihirbazıyla size varsayılan olarak verilir) yerine Activity'i genişlettiğinizden emin olun. O zaman kullanabilirsin

requestWindowFeature(Window.FEATURE_NO_TITLE);

veya

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

SONRA super.onCreate()...


3

Bu hatayı farklı bir iş akışından da aldım. Özel bir DialogFragment sınıfı oluşturdum ve iki @Overrideişlev oluşturdum - onCreateView ve onCreateDialog. OnCreateView işlevim, parça için özel bir düzen yakaladı ve onCreateDialog işlevim bir AlertDialog.Builder oluşturdu.

Bu işe yaramadı çünkü onCreateDialog onCreateView'den önce çağrıldı. OnCreateView'ü sildikten sonra [özel görünüm enflasyonumu onCreateDialog'a taşıyarak, şu hatayla karşılaştım:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

1) iletişim kutusunun ana görünümü için bir düzen kullanmak ve 2) Oluşturucu önceden tanımlanmış Pozitif / Negatif düğmelerini kullanmak istediğim için her iki geçersiz kılmayı da uygulamaya çalışmaktan güçlüğümün geldiğini fark ettim. Çözümüm, özel iletişim kutusu görünümümde pozitif / negatif düğmeler oluşturmaktı, bu yüzden Override onCreateDialog işlevinin uygulamasını sildim.

Umarım bu gelecekte birine yardımcı olur!

İşte bana yardımcı olan bazı SO soruları:


1
dostum günümü kurtardın! Teşekkür ederim! :)
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>

sadece bu şekilde stil belirleyin, herhangi bir kodlama tarafı değişikliğine gerek yoktur.


1

Bir DialogFragment'ı genişletiyordum ve yukarıdaki cevap işe yaramadı. Başlığı kaldırmak için getDialog () kullanmak zorunda kaldım:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

1

( ActionBarActivity ) yerine ( Activity ) öğesini genişlet

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

sonra onCreate yazısında:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);

0

Sanırım bunu yapmanın en basit yolu aşağıdaki kodu kullanmak

  getActionBar().setTitle(null);

0

Lütfen aşağıdaki seçenekleri deneyin, bunlardan en az biri sizin için çalışmalıdır:

  1. Bir DialogFragment kullanıyorsanız, her iki yöntemi de geçersiz kılmamaya çalışın onCreateDialog(..)ve onCreateView(..) (Bu değişiklik benim için çalıştı)

  2. aktiviteden supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)önce setContentView(..)ve sonra deneyinsuper.onCreate(..);

  3. Daha önce 2. seçeneği deneyin super.onCreate(..);


0

Satırın yanlış yerleştirildi: super.onCreate (SavedInstanceState);

bu Yöntemi kullanın:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrscanner);

0

Bu hatayı yaşadım AlertDialogve hata API 19'da yalnızca dialog.show()çağrıldığında oluyordu.

android.app.AlertDialogithalatın soruna neden olduğunu anladım , ben de değiştirdim androidx.appcompat.app.AlertDialogve düzelttim.

Androidx kullanıyorsanız bunun işe yarayacağını unutmayın. değilseniz, bu içe aktarmanın eski uygulama uyumlu sürümünü kullanmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.