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.