2015-04-22 111 views
325

我刚刚升级我的应用程序以使用新发布的v22.1.0 AppCompat,并且我现在在打开以下异常时打开我的应用程序升级到AppCompat v22.1.0,现在得到IllegalArgumentException: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) 

我该如何解决?

回答

503

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发行说明中提供此信息;) –

+2

我的主题包括Theme.AppCompat.Light.NoActionBar。我试图在PreferenceActivity中使用委托版本,我仍然看到这个异常... =/ – niqueco

+42

如果有人发现在尝试这两个选项后,异常仍然存在,请确保您的活动在super.onCreate之后调用setContentView,不是之前。我之前曾将其称为其他用途,但我必须改变它以避免错误。 – jmart

0

价值观-V21夹,只是使用在style.xml不需要其他编辑

<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); 
    } 
} 
+10

请注意,OP是图书馆的作者,并立即回答他自己的问题 – auval

13

我加

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

但它不够。 最后,在活动之前的setContentView移动super.onCreate - 固定我的问题:)

public void onCreate(Bundle savedInstanceState) {  

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

完美。谢谢 – formica

+0

谢天谢地,在onCreate后找到了移动setContentView的答案,我为它挣扎了半天...... – Oliv

33

那些毕竟这些修复谁仍然得到错误。

请从

Theme.AppCompat.Light.NoActionBar 

继承和不使用

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

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

+0

你救了我的一天! – varunkr

+0

这是正确的答案! – Eagle

+0

现在,谢谢 –

相关问题