Naik ke AppCompat v22.1.0 dan sekarang mendapatkan IllegalArgumentException: AppCompat tidak mendukung fitur tema saat ini


336

Saya baru saja memutakhirkan aplikasi untuk menggunakan AppCompat v22.1.0 yang baru dirilis dan saya sekarang mendapatkan pengecualian berikut ketika saya membuka aplikasi saya.

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)

Bagaimana saya memperbaikinya?

Jawaban:


515

AppCompat sekarang lebih ketat pada apa yang diharapkan di bendera jendela tema, lebih dekat mencocokkan apa yang akan Anda dapatkan dari kerangka kerja.

Alasan utama di balik ini adalah untuk mendukung AppCompatDialogs yang juga kami tambahkan dalam rilis ini. Mereka banyak menggunakan windowNoTitlebendera, yang sebelumnya tidak diperhatikan oleh AppCompat.

Jadi untuk memperbaiki masalah Anda, Anda memiliki dua opsi:

Cara mudahnya adalah menggunakan saja Theme.AppCompat.NoActionBartema orang tua Anda. Ini akan selalu melakukan hal yang benar.

Jika Anda tidak dapat melakukannya (mungkin Anda perlu mendukung bilah tindakan dan tidak ada bilah tindakan), Anda harus melakukan hal berikut:

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

Anda harus kembali ke jalur sekarang.


129
Lebih baik memiliki informasi ini dalam catatan rilis appcompat;)
Veaceslav Gaidarji

42
Jika ada yang menemukan bahwa setelah mencoba kedua opsi pengecualian masih berlanjut, pastikan bahwa aktivitas Anda memanggil setContentView setelah super.onCreate, bukan sebelumnya. Saya memanggilnya sebelumnya untuk tujuan lain, tetapi saya harus mengubahnya untuk menghindari kesalahan.
jmart

27
Dalam kasus saya, saya harus mengubah <item name = "android: windowNoTitle"> true </item> yang telah saya definisikan sebelumnya menjadi <item name = "windowNoTitle"> true </item> untuk menyingkirkan pengecualian.
Meanman

12
@ChrisBanes: Anda bekerja dengan Android di Google- mungkin Anda dapat membujuk tim untuk merilis catatan rilis yang lebih menyeluruh di masa depan. Dengan cara ini, pengembang Android dapat menggunakannya untuk men-debug kesalahan dengan fitur desain Android sendiri alih-alih menemukan kesalahan pada waktu kompilasi.

3
Perhatikan bahwa Anda mungkin harus melakukan perubahan ini di file XML gaya DAN tema utama AND di versi v21. Menangkap saya
rfay

34

Mereka yang masih mendapatkan kesalahan setelah semua itu diperbaiki.

Silakan diwarisi dari

Theme.AppCompat.Light.NoActionBar

dan jangan gunakan

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

Kemudian, Anda tidak akan mendapatkan kesalahan apa pun.


Jawaban Hebat +1
sandeepmaaram

13

saya tambahkan

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

tapi itu tidak cukup. Akhirnya, memindahkan super.onCreate sebelum setContentView di Activity - memperbaiki masalah saya :)

   public void onCreate(Bundle savedInstanceState) {    

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

Untungnya menemukan jawaban Anda memindahkan setContentView setelah onCreate, saya kesulitan dengan itu selama setengah hari ...
Oliv

0

Cukup gunakan ini di style.xmlfolder in values-v21 Anda tidak diperlukan pengeditan lainnya

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

Jangan menambahkan apa pun ke file aktivitas, silakan tinggalkan

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
Perhatikan bahwa OP adalah penulis perpustakaan, dan segera menjawab pertanyaannya sendiri
Amir Uval
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.