AppCompat v22.1.0 sürümüne yükseltildi ve şimdi IllegalArgumentException kullanılıyor: AppCompat, geçerli tema özelliklerini desteklemiyor


336

Yeni yayınlanan v22.1.0 AppCompat'ı kullanmak için uygulamamı yeni sürüme geçirdim ve şimdi uygulamamı açtığımda aşağıdaki istisnayı alıyorum.

Caused by: java.lang.IllegalArgumentException: AppCompat does not support the current theme features
        at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:360)
        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)

Nasıl düzeltebilirim?

Yanıtlar:


515

AppCompat artık tema pencere bayraklarında ne beklediğine daha sıkı, çerçeveden alacağınız şeyle daha yakından eşleşiyor.

Bunun temel nedeni , bu sürümde de eklediğimiz AppCompatDialog'ları desteklemektir . Daha windowNoTitleönce AppCompat'ın fazla dikkat etmediği bayrağı yoğun bir şekilde kullanıyorlar .

Bu nedenle, sorununuzu çözmek için iki seçeneğiniz vardır:

Kolay yol sadece Theme.AppCompat.NoActionBarana temanız olarak kullanmaktır . Bu her zaman doğru olanı yapar.

Bunu yapamıyorsanız (belki de eylem çubuğunu desteklemeniz ve eylem çubuğunu desteklememeniz gerekir), aşağıdakileri yapmanız gerekir:

<style name="MyTheme" parent="Theme.AppCompat">
    ...
</style>

<style name="MyTheme.NoActionBar">
    <!-- Both of these are needed -->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

Şimdi tekrar yoluna gitmelisin.


129
Appcompat sürüm notlarında bu bilgilere sahip olmak daha iyi;)
Veaceslav Gaidarji

42
Birisi her iki seçeneği de denedikten sonra istisnanın hala devam ettiğini fark ederse, etkinliğinizin daha önce değil super.onCreate öğesinden sonra setContentView öğesini çağırdığından emin olun. Daha önce başka amaçlar için aradım, ancak hatayı önlemek için değiştirmek zorunda kaldım.
jmart

27
Benim durumumda, istisnadan kurtulmak için daha önce <item name = "windowNoTitle"> true </item> olarak tanımladığım <item name = "android: windowNoTitle"> true </item> 'i değiştirmek zorunda kaldım.
Meanman

12
@ChrisBanes: Google'da Android ile çalıştınız. Belki de takımı gelecekte daha kapsamlı sürüm notları yayınlamaya ikna edebilirsiniz. Bu şekilde, Android geliştiricileri, derleme zamanında hatalara rastlamak yerine Android tasarım özellikleriyle hataları ayıklamak için kullanabilirler.

3
Bu değişikliği muhtemelen hem ana stiller / temalar XML dosyasında hem de v21 sürümünde yapmanız gerektiğini unutmayın. Beni yakaladın.
rfay

34

Bütün bu düzeltmelerden sonra hala hata yapanlar.

Lütfen kaynağını devral

Theme.AppCompat.Light.NoActionBar

ve kullanma

<item name="windowActionBar">false</item>

Sonra herhangi bir hata almayacaksınız.


Harika Cevap +1
sandeepmaaram

13

ekledim

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

ama yeterli değildi. Son olarak, super.onCreate'ı aktivite öncesi setContentView'a taşıma - sorunum düzeltildi :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...

Neyse ki onCreate'den sonra setContentView taşıma cevabını buldum, yarım gün boyunca bununla mücadele ediyorum ...
Oliv

0

Bunu style.xmlbaşka bir düzenlemeye gerek duymadan, değerler-v21 klasörünüzde kullanın

 <style name="AppTheme" parent="Theme.AppCompat">

    <!-- theme customizations -->

   <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
 </style>

Etkinlik dosyasına hiçbir şey eklemeyin, lütfen bırakın

public class Main extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

11
OP'nin kütüphanenin yazarı olduğuna dikkat edin ve hemen kendi sorusunu cevaplayın
Amir Uval
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.