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

Chr*_*nes 333 android android-appcompat

我刚刚升级了我的应用程序以使用新发布的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)
Run Code Online (Sandbox Code Playgroud)

我如何解决它?

Chr*_*nes 513

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>
Run Code Online (Sandbox Code Playgroud)

你现在应该回到正轨.

  • 最好在appcompat发行说明中获取此信息;) (129认同)
  • 如果有人发现在尝试两个选项之后异常仍然存在,请确保您的活动在super.onCreate之后调用setContentView,而不是之前.我之前打电话给它用于其他目的,但我不得不改变它以避免错误. (42认同)
  • 在我的情况下,我不得不将之前定义的<item name ="android:windowNoTitle"> true </ item>更改为<item name ="windowNoTitle"> true </ item>以消除异常. (27认同)
  • @ChrisBanes:你曾在谷歌与Android合作过 - 也许你可以说服团队在未来发布更全面的发行说明.这样,Android开发人员可以使用它来自行调试Android设计功能的错误,而不是在编译时绊倒错误. (12认同)
  • 请注意,您可能必须在主样式/主题XML文件和v21版本中进行此更改.抓到我. (3认同)
  • 我的主题包括Theme.AppCompat.Light.NoActionBar.我正在尝试在PreferenceActivity中使用委托版本,我仍然看到这个异常...... = / (2认同)
  • 真正需要的是从中删除"android:"所需的所有属性的列表.我花了几个小时现在追踪哪些属性是框架属性,哪些属性需要使用appcompat. (2认同)

Adn*_*nan 34

那些在所有修复之后仍然会出错的人.

请继承

Theme.AppCompat.Light.NoActionBar
Run Code Online (Sandbox Code Playgroud)

并且不要使用

<item name="windowActionBar">false</item>
Run Code Online (Sandbox Code Playgroud)

然后,你不会得到任何错误.


Ser*_*nko 13

我补充道

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
Run Code Online (Sandbox Code Playgroud)

但它还不够.最后,在Activity中的setContentView之前移动super.onCreate - 修复了我的问题:)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
Run Code Online (Sandbox Code Playgroud)