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)

どうすれば修正できますか?

回答:


515

AppCompatは、テーマウィンドウフラグで期待するものにより厳密になり、フレームワークから得られるものにより厳密に一致しています。

この背後にある主な理由は、今回のリリースで追加したAppCompatDialogsをサポートするためです。これらのwindowNoTitleフラグは、AppCompatが以前はあまり注意を払っていなかったフラグを多用しています。

したがって、問題を修正するには、2つのオプションがあります。

簡単な方法は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
両方のオプションを試しても例外が引き続き発生する場合は、アクティビティがsetContentViewを呼び出す前に、super.onCreateの後ではないことを確認してください。以前は他の目的で呼び出しましたが、エラーを回避するために変更する必要がありました。
jmart 2015

27
私の場合、以前に定義した<item name = "android:windowNoTitle"> true </ item>を<item name = "windowNoTitle"> true </ item>に変更して、例外を取り除く必要がありました。
Meanman 2015

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>

しかし、それは十分ではありませんでした。最後に、アクティビティのsetContentViewの前にsuper.onCreateを移動しました-私の問題を修正しました:)

   public void onCreate(Bundle savedInstanceState) {    

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

ありがたいことに、onCreateの後にsetContentViewを移動するというあなたの答えを見つけました。私は半日それと格闘しています...
Oliv

0

これをstyle.xmlvalues-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.