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?

Chris Banes
sumber

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.

Chris Banes
sumber
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.

Adnan
sumber
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);
        ...
Sergey Vakulenko
sumber
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);
    }
}
Ribin Haridas
sumber
11
Perhatikan bahwa OP adalah penulis perpustakaan, dan segera menjawab pertanyaannya sendiri
Amir Uval