升级到AppCompat v22.1.0,现在获得IllegalArgumentException:AppCompat不支持当前的主题功能


336

我刚刚升级了我的应用程序以使用新发布的v22.1.0 AppCompat,现在打开应用程序时出现以下异常。

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)

我如何解决它?

Answers:


515

AppCompat现在对主题窗口标志的预期更加严格,与您从框架中获得的匹配更加紧密。

其背后的主要原因是支持我们也在此版本中添加的AppCompatDialogs。他们大量使用了该windowNoTitle标志,AppCompat以前并未对此进行过多关注。

因此,要解决您的问题,您有两种选择:

简单的方法是仅用Theme.AppCompat.NoActionBar作父主题。这将永远做正确的事。

如果您还是不能做到这一点(也许您需要支持操作栏而没有操作栏),则应执行以下操作:

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

您现在应该回到正轨。


129
最好在appcompat发行说明中包含此信息;)
Veaceslav Gaidarji 2015年

42
如果有人在尝试这两个选项后发现异常仍然存在,请确保您的活动在super.onCreate之后而不是之前调用setContentView。我之前出于其他目的调用了它,但是为了避免该错误,我不得不对其进行了更改。
jmart

27
在我的情况下,我不得不将之前定义的<item name =“ android:windowNoTitle”> true </ item>更改为<item name =“ windowNoTitle”> true </ item>以摆脱该异常。
Meanman

12
@ChrisBanes:您曾在Google的Android平台上工作过-也许您可以说服团队将来发布更详尽的发行说明。这样,Android开发人员可以使用它自己调试具有Android设计功能的错误,而不必在编译时绊倒错误。

3
请注意,您可能必须同时在主要样式/主题XML文件和v21版本中进行此更改。抓住了我。
rfay 2015年

34

那些人在完成所有这些修复后仍然出错。

请继承

Theme.AppCompat.Light.NoActionBar

而且不要使用

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

这样,您就不会出错。


好答案+1
sandeepmaaram

13

我加了

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

但这还不够。最后,将super.onCreate移到Activity中的setContentView之前-解决了我的问题:)

   public void onCreate(Bundle savedInstanceState) {    

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

幸好在onCreate之后找到了移动setContentView的答案,我为此

0

只需在您style.xml的values-v21文件夹中使用它,无需其他编辑

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

不要在活动文件中添加任何内容,请保留它

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是图书馆的作者,并立即回答了他自己的问题
Amir Uval
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.