ActionBarCompat : java.lang.IllegalStateException : Theme.AppCompat를 사용해야합니다.


102

나는 안드로이드 2.3.5에서의 RuntimeException을 얻고있다하지만 난 하고 Theme.AppCompat (고해상도 / 값 / themes.xml)를 사용하여. 이것은 전화입니다 : http://www.gsmarena.com/samsung_galaxy_y_s5360-4117.php

 <!-- res/values/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>

     <style name="Theme.Styled" parent="@style/Theme.AppCompat">
         <item name="actionBarStyle">@style/QueryActionBar</item>
         <item name="android:actionBarStyle">@style/QueryActionBar</item>
     </style>

     <style name="QueryActionBar" parent="@style/Widget.AppCompat.ActionBar">
         <item name="background">@color/blueback</item>
         <item name="android:background">@color/blueback</item>
         <item name="backgroundSplit">@color/blueback</item>
         <item name="android:backgroundSplit">@color/blueback</item>
     </style>

 </resources>

다음은 values-v11에 대한 파일입니다.

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@android:style/Theme.Holo">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

여기에 오류가 있습니다.

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.txt2lrn.www/com.txt2lrn.www.LandingActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
 at android.app.ActivityThread.access$1500(ActivityThread.java:117)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:130)
 at android.app.ActivityThread.main(ActivityThread.java:3687)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
 at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:102)
 at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
 at com.txt2lrn.www.LandingActivity.onCreate(LandingActivity.java:95)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
 ... 11 more

죄송합니다. AndroidManifest.xml에 android : theme = "@ style / Theme.Styled"도 정의되어 있습니다.


1
매니페스트 참조가 Theme.Styled있습니까?
CommonsWare

3
Theme.Styled를 참조하지만 AppCompat 테마를 사용하지 않는 다른 값 폴더가 있습니까?
tyczj 2013-08-05

@tyczj res / values-v11 / themes.xml 파일을 추가했는데 Theme.Styled
AG1

그것은 일반적인 문제가 될 수 있기 때문에 @tyczj 당신은 응답으로 의견을 사용할 수 있습니다 (나도)
발렌티노 Dell'Aica

답변:


96

MainActivity에서 ActionBarActivity를 확장하는 경우 values-v11에서도 상위 테마를 변경해야합니다.
따라서 values-v11의 style.xml은 다음과 같습니다.

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@style/Theme.AppCompat">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

편집 : ActionBar 사용을 중지하고 Android 디자인 지원 라이브러리에 포함 된 AppBar 레이아웃을 사용하는 것이 좋습니다.


5
훌륭합니다. 놓쳤습니다. 다른 모든 -vXX 폴더도 잊지 마십시오. 그렇지 않으면 누군가 해당 버전 중 하나를 사용하면 당신을 물기 위해서만 테스트 환경에서 잘 작동합니다.
falstro

1
감사! ActionBarActivity를 Activity로 변경했습니다! :)
Inoy 2014 년

66

ActionBar Compat를 추가하려면 활동 또는 애플리케이션이 다음과 같이 AndroidManifest.xml에서 @ style / Theme.AppCompat 테마를 사용해야합니다.

   <activity
        ...
        android:theme="@style/Theme.AppCompat" />

그러면 활동에 액션 바가 추가됩니다 (또는이 테마를 애플리케이션에 추가 한 경우 모든 활동).


그러나 일반적으로 작업 표시 줄을 사용자 정의해야합니다. 이렇게하려면 "@ style / Theme.AppCompat.Light"와 같이 Theme.AppCompat 부모를 사용하여 두 가지 스타일을 만들어야합니다. 첫 번째는 api 11> = (안드로이드 액션 바에 빌드 된 안드로이드 버전), 두 번째는 api 7-10 (액션 바에 빌드 없음)을위한 것입니다.

첫 번째 스타일을 살펴 보겠습니다. 그것은에 위치 할 고해상도 / 값-V11 / styles.xml . 다음과 같이 표시됩니다.

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:background">@drawable/ab_custom_solid_styled</item>
    <item name="android:backgroundStacked"
      >@drawable/ab_custom_stacked_solid_styled</item>
    <item name="android:backgroundSplit"
      >@drawable/ab_custom_bottom_solid_styled</item>
</style>

그리고 api 7-10에 대해 동일한 스타일이 필요합니다. 그것은에 위치 할 고해상도 / 값 / styles.xml 하지만 API 수준이 아직 원래의 안드로이드 액션 바 스타일의 항목에 대해 알고하지 않기 때문에, 우리는 지원 라이브러리에서 제공되는 선택 사항 중 하나를 사용해야합니다. ActionBar Compat 항목은 원래 Android처럼 정의되지만 앞에 "android :"부분이 없습니다.

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="background">@drawable/ab_custom_solid_styled</item>
    <item name="backgroundStacked">@drawable/ab_custom_stacked_solid_styled</item>
    <item name="backgroundSplit">@drawable/ab_custom_bottom_solid_styled</item>
</style>

10보다 높은 API 레벨에 이미 액션 바가 있더라도 AppCompat 스타일을 사용해야한다는 점을 표시하십시오. 그렇지 않으면 Android 3.0 이상이 설치된 기기에서 Acitvity를 시작할 때 다음 오류가 발생합니다.

java.lang.IllegalStateException :이 활동에 Theme.AppCompat 테마 (또는 하위 항목)를 사용해야합니다.

다음은 Chris Banes가 작성한 이 원본 기사 http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html 링크 입니다.

추신 : 내 영어 죄송합니다


못 박았다! UPVPTED
tony gil

20

theme.styled를 참조하고 AppCompat 테마를 사용하지 않는 다른 값 폴더가 없는지 확인하고 확인하십시오.

values-v11폴더


이것도 제 문제였습니다. 라이브러리 프로젝트가 있었고 appcompat-v7 라이브러리를 가져 와서 모든 테마가 AppCompat 테마를 확장하도록해야했습니다. 문제는 내 주 프로젝트에 tools : replace = "android : icon, android : theme"옵션이 <application>에 추가되어 있고 다른 프로젝트의 스타일은 제외해야한다는 것입니다. 어떤 이유로 작동하지 않았습니다.
speedynomads 2015 년

16

이 시도...

styles.xml

<resources>
 <style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
 </style>
</resources>

AndroidManifest.xml

   <activity
        android:name="com.example.Home"
        android:label="@string/app_name" 
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

11

귀하의 Activity확장 ActionBarActivityAppCompat.theme적용 되어야합니다 . 에서 변경 ActionBarActivityActivity하거나 FragmentActivity이 문제를 해결합니다.


4

빌드-> 프로젝트 정리를 수행하십시오. 나는 이것이 당신의 문제를 해결할 것이라고 생각합니다.


3

내 매니페스트가 테마를 참조하지 않습니다 ... AFAIK가 필요하지 않습니다.

물론입니다. Theme.Styled활동 에 마법처럼 적용 되는 것은 없습니다 . 활동 또는 전체 애플리케이션이를 사용 Theme.Styled하고 있음을 선언해야합니다 . 예 :

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Styled">

나는 틀렸다. 내 AndroidManifest.xml에 android : theme = "@ style / Theme.Styled"가 있습니다 (처음에는 보지 못함).
AG1 2013-08-06

3

CustomAdapter 클래스 내에서 일부 작업을 수행 할 때 DialogBox를 만들려고 할 때이 오류가 발생했습니다. 이것은 활동이 아니라 어댑터 클래스입니다. 36 시간의 노력과 해결책을 모색 한 끝에 저는 이것을 생각해 냈습니다.

CustomAdapter를 호출하는 동안 활동을 매개 변수로 보냅니다.

CustomAdapter ca = new CustomAdapter(MyActivity.this,getApplicationContext(),records);

사용자 정의 어댑터에서 변수를 정의하십시오.

Activity parentActivity;
Context context;

다음과 같이 생성자를 호출하십시오.

public CustomAdapter(Activity parentActivity,Context context,List<Record> records){
    this.parentActivity=parentActivity;
    this.context=context;
    this.records=records;
}

마지막으로 어댑터 클래스 내부에 대화 상자를 만들 때 다음과 같이하십시오.

AlertDialog ad = new AlertDialog.Builder(parentActivity).setTitle("Your title");

and so on..

도움이 되었기를 바랍니다.


2

내 응용 프로그램을 ActionBarSherlock에서 ActionBarCompat로 이동했습니다. 다음과 같이 이전 테마를 선언하십시오.

<style name="Theme.Event" parent="Theme.AppCompat">

그런 다음 AndroidManifest.xml에서 테마를 설정합니다.

<application
    android:debuggable="true"
    android:name=".activity.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Event.Home"
     >

2

활동이 Theme.AppCompat을 사용했지만 삼성 장치 에서 그러한 충돌이 발생했습니다 . 근본 원인은 삼성 측의 이상한 최적화와 관련이 있습니다.

- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme

내 솔루션은 android:launchMode="singleTask"


1
이것에 대한 출처가 있습니까? 나는 한동안 내 앱에서 유사한 버그를 추적 해 왔으며 이것은 유망한 리드처럼 들립니다.
Dmitry Brant 2015 년

여기도 마찬가지입니다! 이것에 대해 더 많이 알고 싶습니다! 내 앱에서도 유사한 버그를 추적하고 있습니다. 불행히도 나는 android:launchMode="singleTask".
acrespo

나는 같은 문제를 관찰합니다. Galaxy Tab A 10.1 (루팅되지 않은 Android 7.0 및 SM-A320FL (루팅되지 않은 Android 7.0)에서 발생합니다. 사용하지 않습니다.android:launchMode="singleTask" 내 모든 활동은 APPCOMPAT 테마를 사용 : /
user2990759

2

제 경우에는 사용자 정의보기 생성자에 추가 한 사용자 정의보기를 만들었습니다.

new RoomView(getAplicationContext());

올바른 컨텍스트는 활동이므로 다음과 같이 변경되었습니다.

new RoomView(getActivity());

또는

new RoomView(this);

1

내 목록보기의 경우 ArrayAdapter를 확장하는 사용자 정의 어댑터를 사용하고 있습니다. listiview에는 Custom AlertDialogBox와 같은 버튼 중 하나에 2 개의 버튼이 있습니다. 예 : 활동 parentActivity; 어댑터 생성자`

public CustomAdapter(ArrayList<Contact> data, Activity parentActivity,Context context) {
        super(context,R.layout.listdummy,data);
        this.mContext   =   context;
        this.parentActivity  =   parentActivity;
    }

`MainActivty에서 어댑터 호출

adapter = new CustomAdapter(dataModels,MainActivity.this,this);

이제 Adapter 클래스에있는 ur 버튼 안에 ur alertdialog를 작성하십시오.

viewHolder.update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
            

                AlertDialog.Builder alertDialog =   new AlertDialog.Builder(parentActivity);
                alertDialog.setTitle("Updating");
                alertDialog.setCancelable(false);

                LayoutInflater layoutInflater   = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                 @SuppressLint("InflateParams") final View view1   =   layoutInflater.inflate(R.layout.dialog,null);
                alertDialog.setView(view1);
                alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                    }
                });
                alertDialog.setPositiveButton("Update", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    //ur logic
                            }
                    }
                });
                  alertDialog.create().show();

            }
        });


-2

para resolver o meu problema, eu apenas adicionei na minha MainActivity ( "Theme = 내 문제를 해결하기 위해 MyTheme가 내 테마의 이름 인 MainActivity ("Theme = "@ style / MyTheme" ")에 방금 추가했습니다.

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.