ActionBarCompat: java.lang.IllegalStateException: você precisa usar um Theme.AppCompat


102

Estou recebendo uma RuntimeException no Android 2.3.5, mas estou usando Theme.AppCompat (res / values ​​/ themes.xml). Este é o telefone: 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>

Aqui está o arquivo para os valores-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>

Aqui está o erro.

 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

Desculpe pessoal, eu também tenho android: theme = "@ style / Theme.Styled" definido em AndroidManifest.xml.


1
O seu manifesto faz referência Theme.Styled?
CommonsWare

3
você tem outra pasta de valores que faz referência a Theme.Styled, mas não usa o tema AppCompat?
tyczj

@tyczj Eu adicionei o arquivo res / values-v11 / themes.xml e ele não faz referência a Theme.Styled
AG1

@tyczj Você pode usar seu comentário como uma resposta, pois pode ser um problema comum (eu também)
Valentino Dell'Aica

Respostas:


96

Se você estiver estendendo ActionBarActivity em sua MainActivity, terá que alterar o tema pai em values-v11 também.
Portanto, o style.xml em values-v11 será -

 <!-- 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>

EDIT: Eu recomendo que você pare de usar ActionBar e comece a usar o layout AppBar incluído na Android Design Support Library


5
Excelente, eu perdi isso. Não se esqueça de todas as outras pastas -vXX também, ou funcionará bem em seu ambiente de teste, apenas para mordê-lo quando alguém usar uma dessas versões.
falstro de

1
Obrigado! Acabei de alterar ActionBarActivity para Activity! :)
Inoy,

66

Para simplesmente adicionar o ActionBar Compat, sua atividade ou aplicativo deve usar o tema @ style / Theme.AppCompat em AndroidManifest.xml como este:

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

Isso adicionará a barra de ação na atividade (ou todas as atividades se você adicionou este tema ao aplicativo)


Mas geralmente você precisa personalizar sua barra de ações. Para fazer isso, você precisa criar dois estilos com o pai Theme.AppCompat, por exemplo, "@ style / Theme.AppCompat.Light". O primeiro será para api 11> = (versões do android com build na actionbar do android), o segundo para api 7-10 (sem build no actionbar).

Vejamos o primeiro estilo. Ele estará localizado em res / values-v11 / styles.xml . Isso parecerá assim:

<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>

E você precisa ter o mesmo estilo para api 7-10. Ele estará localizado em res / values ​​/ styles.xml , MAS como os níveis da API ainda não sabem sobre os itens de estilo da barra de ação do Android original, devemos usar um, fornecido pela biblioteca de suporte. Os itens do ActionBar Compat são definidos como o Android original, mas sem a parte "android:" na frente:

<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>

Marque que, mesmo se os níveis de API superiores a 10 já tiverem barra de ação, você ainda deve usar estilos AppCompat. Caso contrário, você terá este erro no lançamento do Acitvity em dispositivos com Android 3.0 e superior:

java.lang.IllegalStateException: você precisa usar um tema Theme.AppCompat (ou descendente) com esta atividade.

Aqui está o link deste artigo original http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html escrito por Chris Banes.

PS desculpa pelo meu ingles


acertou em cheio! ATUALIZADO
Tony gil

20

Verifique e certifique-se de que você não tenha outra pasta de valores que faça referência a theme.styled e não use o tema AppCompat

ie values-v11pasta


Esse era o meu problema também. Eu tinha um projeto de biblioteca e tive que importar a biblioteca appcompat-v7 e fazer todos os temas estenderem os temas AppCompat. O fato é que meu projeto principal tem as ferramentas: replace = "android: icon, android: theme" opção adicionada ao <application> e deve deixar de fora estilos de outros projetos. Por algum motivo, isso não estava funcionando.
speedynomads de

16

Experimente isso ...

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

Seu Activityestá estendendo o ActionBarActivityque requer que o AppCompat.themeseja aplicado. Altere de ActionBarActivitypara Activityou FragmentActivity, isso resolverá o problema.


4

Basta fazê-lo Build -> Clean Project. Acho que isso vai resolver seu problema.


3

Meu manifesto não faz referência a nenhum tema ... não deveria ter que AFAIK

Claro que sim. Nada vai se aplicar magicamente Theme.Styleda uma atividade. Você precisa declarar que suas atividades - ou todo o seu aplicativo - está usando Theme.Styled, por exemplo:

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

Eu estava incorreto, tenho android: theme = "@ style / Theme.Styled" no meu AndroidManifest.xml (não o vi da primeira vez).
AG1 de

3

Encontrei este erro quando estava tentando criar uma DialogBox quando alguma ação é executada dentro da classe CustomAdapter. Esta não era uma atividade, mas uma classe de adaptador. Depois de 36 horas de esforços e procurando soluções, eu descobri isso.

Envie a Activity como um parâmetro enquanto chama o CustomAdapter.

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

Defina as variáveis ​​no adaptador personalizado.

Activity parentActivity;
Context context;

Chame o construtor assim.

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

E, finalmente, ao criar a caixa de diálogo dentro da classe do adaptador, faça assim.

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

and so on..

Espero que isso ajude você


2

Acabei de fazer meu aplicativo passar de ActionBarSherlock para ActionBarCompat. Tente declarar seu antigo tema assim:

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

Em seguida, defina o tema em seu 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

Tive esse travamento em dispositivos Samsung , embora a atividade usasse Theme.AppCompat . A causa raiz estava relacionada a otimizações estranhas do lado da Samsung:

- 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

Minha solução foi apenas remover android:launchMode="singleTask"


1
Você tem uma fonte para isso? Estou rastreando um bug semelhante em meu aplicativo há um tempo, e isso parece uma pista promissora.
Dmitry Brant

O mesmo aqui! Adoraria saber mais sobre isso! Tenho rastreado um bug semelhante em meu aplicativo também. Infelizmente, eu não uso android:launchMode="singleTask".
acrespo de

Eu observo o mesmo problema. Isso está acontecendo com o Galaxy Tab A 10.1 (Android 7.0, sem root e SM-A320FL (Android 7.0, sem root). Eu não uso android:launchMode="singleTask"e todas as minhas atividades usam o tema AppCompat: /
user2990759

2

no meu caso eu fiz uma visão personalizada que adicionei ao construtor de visão personalizada

new RoomView(getAplicationContext());

o contexto correto é a atividade, então mude para:

new RoomView(getActivity());

ou

new RoomView(this);

1

Para minha visualização de lista, estou usando um adaptador customizado que estende ArrayAdapter. em listiview eu tenho 2 botões um dos botões como Custom AlertDialogBox. Ex: Activity parentActivity; Construtor para Adaptador `

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

`chamando Adaptador de MainActivty

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

agora escreva o seu diálogo de alerta dentro do seu botão que está na classe Adaptador

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 = Para resolver o meu problema, acabei de adicioná-lo na minha MainActivity (" Theme = "@ style / MyTheme" ") onde MyTheme é o nome do meu tema

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.