Được nâng cấp lên AppCompat v22.1.0 và hiện đang nhận IllegalArgumentException: AppCompat không hỗ trợ các tính năng chủ đề hiện tại


336

Tôi vừa nâng cấp ứng dụng của mình để sử dụng AppCompat v22.1.0 mới phát hành và giờ tôi đang gặp ngoại lệ sau khi mở ứng dụng.

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)

Làm thế nào để tôi sửa nó?

Câu trả lời:


515

AppCompat hiện nghiêm ngặt hơn về những gì nó mong đợi trong các cờ cửa sổ chủ đề, phù hợp hơn với những gì bạn sẽ nhận được từ khung.

Lý do chính đằng sau điều này là để hỗ trợ AppCompatDialogs mà chúng tôi cũng đã thêm vào trong phiên bản này. Họ sử dụng rất nhiều windowNoTitlecờ, điều mà AppCompat trước đây không chú ý đến.

Vì vậy, để khắc phục vấn đề của bạn, bạn có hai lựa chọn:

Cách dễ dàng là chỉ sử dụng Theme.AppCompat.NoActionBarlàm chủ đề chính của bạn. Điều này sẽ luôn luôn làm đúng.

Nếu bạn không thể làm điều đó mặc dù (có thể bạn cần hỗ trợ thanh hành động và không có thanh hành động), bạn nên làm như sau:

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

Bạn nên trở lại theo dõi ngay bây giờ.


129
Tốt hơn là có thông tin này trong ghi chú phát hành appcompat;)
Veaceslav Gaidarji

42
Nếu bất cứ ai thấy rằng sau khi thử cả hai tùy chọn, ngoại lệ vẫn tồn tại, hãy đảm bảo rằng hoạt động của bạn đang gọi setContentView sau super.onCreate, chứ không phải trước đó. Tôi đã gọi nó trước cho các mục đích khác, nhưng tôi phải thay đổi nó để tránh lỗi.
jmart

27
Trong trường hợp của tôi, tôi đã phải thay đổi <item name = "android: windowNoTitle"> true </ item> mà trước đây tôi đã xác định thành <item name = "windowNoTitle"> true </ item> để loại bỏ ngoại lệ.
Meanman

12
@ChrisBanes: Bạn đã làm việc với Android tại Google - có thể bạn có thể thuyết phục nhóm phát hành các ghi chú phát hành kỹ lưỡng hơn trong tương lai. Bằng cách này, các nhà phát triển Android có thể sử dụng nó để gỡ lỗi với các tính năng thiết kế Android thay vì vấp phải các lỗi trong thời gian biên dịch.

3
Lưu ý rằng bạn có thể phải thực hiện thay đổi này cả trong tệp XML kiểu / chủ đề chính VÀ trong phiên bản v21. Bắt tôi.
rfay

34

Những người vẫn đang gặp lỗi sau khi sửa tất cả.

Hãy thừa kế từ

Theme.AppCompat.Light.NoActionBar

và không sử dụng

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

Sau đó, bạn sẽ không nhận được bất kỳ lỗi.


Câu trả lời tuyệt vời +1
sandeepmaaram

13

Tôi đã thêm

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

nhưng nó không đủ Cuối cùng, di chuyển super.onCreate trước setContentView trong Activity - đã khắc phục sự cố của tôi :)

   public void onCreate(Bundle savedInstanceState) {    

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

Rất may tìm thấy câu trả lời của bạn về việc di chuyển setContentView sau onCreate, tôi đã vật lộn với nó trong nửa ngày ...
Oliv

0

Chỉ cần sử dụng điều này trong style.xmlthư mục value-v21 của bạn mà không cần chỉnh sửa nào khác

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

Đừng thêm bất cứ thứ gì vào tệp hoạt động, vui lòng để lại

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
Lưu ý rằng OP là tác giả của thư viện và đã trả lời câu hỏi của chính anh ta ngay lập tức
Amir Uval
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.