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은 테마 창 플래그에서 예상되는 내용이 더욱 엄격 해져 프레임 워크에서 얻는 것과 더 밀접하게 일치합니다.

이 배후의 주된 이유 는이 릴리스에 추가 된 AppCompatDialog 를 지원하기위한 것 입니다. windowNoTitleAppCompat는 이전에 많은 관심을 기울이지 않은 플래그를 많이 사용 합니다.

따라서 문제를 해결하기 위해 다음 두 가지 옵션이 있습니다.

쉬운 방법은 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 릴리스 노트에서이 정보를하기 위해)
— 베세 슬라 프 Gaidarji에게

42
두 옵션을 모두 시도한 후에도 예외가 계속 발생하면 활동이 이전이 아니라 super.onCreate 후에 setContentView를 호출하는지 확인하십시오. 다른 목적으로 전에 전화했지만 오류를 피하기 위해 변경해야했습니다.
— jmart

27
필자의 경우 예외를 제거하기 위해 이전에 <item name = "windowNoTitle"> true </ item>으로 정의한 <item name = "android : windowNoTitle"> true </ item>을 변경해야했습니다.
— Meanman

12
@ChrisBanes : Google에서 Android로 작업 한 적이 있습니다. 향후 팀에서 더 철저한 출시 노트를 발표하도록 설득 할 수 있습니다. 이런 식으로, Android 개발자는이를 사용하여 컴파일시 오류를 방해하지 않고 Android 디자인 기능 자체로 오류를 디버깅 할 수 있습니다.

3
기본 스타일 / 테마 XML 파일과 v21 버전 모두에서이 변경을 수행해야합니다. 나를 잡았다.
— rfay

34

모든 수정 후에도 여전히 오류가 발생하는 사람들.

에서 상속하십시오

Theme.AppCompat.Light.NoActionBar

그리고 사용하지 마십시오

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

그러면 오류가 발생하지 않습니다.


위대한 답변 +1
— sandeepmaaram

13

나는 덧붙였다

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

그러나 충분하지 않았습니다. 마지막으로 Activity에서 setContentView 전에 super.onCreate를 이동하면 문제가 해결되었습니다. :)

   public void onCreate(Bundle savedInstanceState) {    

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

고맙게도 onCreate 후 setContentView 이동에 대한 답을 찾았습니다. 반나절 동안 어려움을 겪고 있습니다.
— Oliv

0

style.xmlin 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.