it-swarm.dev

È necessario utilizzare un tema Theme.AppCompat (o discendente) con questa attività

Android Studio 0.4.5

Documentazione di Android per la creazione di finestre di dialogo personalizzate: http://developer.Android.com/guide/topics/ui/dialogs.html

Se si desidera una finestra di dialogo personalizzata, è possibile invece visualizzare un'attività come finestra di dialogo anziché utilizzare le API di dialogo. Crea semplicemente un'attività e imposta il tema su Theme.Holo.Dialog in L'elemento manifest <activity>:

<activity Android:theme="@Android:style/Theme.Holo.Dialog" >

Tuttavia, quando ho provato questo ottengo la seguente eccezione:

Java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

Sto supportando quanto segue, e non posso usare qualcosa di più grande di 10 per il minimo:

minSdkVersion 10
targetSdkVersion 19

Nei miei stili ho il seguente:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

E nel mio manifesto ho questo per l'attività:

 <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:theme="@Android:style/Theme.Holo.Light.Dialog"
            Android:name="com.ssd.register.Dialog_update"
            Android:label="@string/title_activity_dialog_update" >
        </activity>

Creare una finestra di dialogo come questa era qualcosa che stavo facendo, perché ho già completato il layout.

Qualcuno può dirmi come posso aggirare questo problema?

848
ant2009

Il motivo per cui si verifica questo problema è perché l'attività a cui si sta tentando di applicare il tema della finestra di dialogo sta estendendo ActionBarActivity che richiede l'applicazione del tema AppCompat

Aggiornamento : estendere AppCompatActivity avrebbe anche questo problema 

In questo caso, modifica l'ereditarietà di Java da ActionBarActivity a Activity e lascia il tema di dialogo nel manifest così com'è, un valore non Theme.AppCompat 


La regola generale è che se vuoi che il tuo codice supporti le versioni precedenti di Android, dovrebbe avere il tema AppCompat e il codice Java dovrebbe estendere AppCompatActivity. Se hai * un'attività che non ha bisogno di questo supporto, ad esempio ti interessano solo le ultime versioni e caratteristiche di Android, puoi applicare qualsiasi tema ad esso, ma il codice Java deve estendere semplicemente Activity.


NOTA: quando cambia da AppCompatActivity (o una sottoclasse, ActionBarActivity), a Activity, deve anche cambiare le varie chiamate con "supporto" alla corrispondente chiamata senza "supporto". Quindi, invece di getSupportFragmentManager, chiama getFragmentManager.

1028
Bobbake4

Tutto quello che devi fare è aggiungere Android:theme="@style/Theme.AppCompat.Light" al tag dell'applicazione nel file AndroidManifest.xml.

495
iusting

Copia la risposta da @MarkKeen nei commenti sopra perché ho avuto lo stesso problema.

Ho avuto l'errore indicato nella parte superiore del post ed è successo dopo aver aggiunto una finestra di avviso. Ho tutte le informazioni sullo stile rilevanti nel manifest. Il mio problema è stato risolto modificando un riferimento al contesto nel generatore di avvisi - Ho cambiato: 

new Android.support.v7.app.AlertDialog.Builder(getApplicationContext())

a: 

new Android.support.v7.app.AlertDialog.Builder(this)

E non più problemi.

211
A.K.

min sdk è 10. ActionBar è disponibile dal livello api 11. Quindi per 10 useresti AppCompat dalla libreria di supporto per la quale devi usare Theme.AppCompat o discendente dello stesso.

Uso

Android:theme="@style/Theme.AppCompat" >

O se non vuoi barra delle azioni in alto

Android:theme="@style/Theme.AppCompat.NoActionBar">

Ulteriori informazioni @

http://developer.Android.com/guide/topics/ui/actionbar.html

Modificare:

Potrei aver letto male post.

Sembra che op vuole una finestra di dialogo con un tema di attività. Quindi, come già suggerito da Bobbake4, estendi Activity invece di ActionBarActivity.

Dai anche un'occhiata agli attributi della finestra di dialogo nel link sottostante

http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/4.4_r1/frameworks/base/core/res/res/values/themes.xml/

88
Raghunandan

Questo ha funzionato per me, ho appena cambiato:

final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

a questo:

final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
71
Darush

Stavo riscontrando questo problema anche se il mio tema era un tema AppCompat e la mia attività era un AppCompatActivity (o Activity, come suggerito nelle risposte di altri). Quindi ho pulito, ricostruito e rieseguito il progetto. 

( Build -> Clean Project; Build -> Rebuild Project; Esegui -> Esegui )

Può sembrare stupido, ma ora funziona funziona alla grande !

Speriamo solo che aiuti!

36
Geraldo Neto

Questo è ciò che per me è stato risolto: invece di specificare il tema in manifest, l'ho definito in onCreate per ogni attività che estende ActionBarActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.MyAppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity_layout);
...
}

Qui MyAppTheme è un discendente di Theme.AppCompat ed è definito in xml. Si noti che il tema deve essere impostato prima di super.onCreate e setContentView.

24
k29

vai ai tuoi stili e metti il ​​genitore

parent="Theme.AppCompat"

invece di 

parent="@Android:style/Theme.Holo.Light"
19
Yamen Nassif

Nel mio caso non ho un file value-v21 nella mia directory res. Poi l'ho creato e aggiunto in esso seguendo i seguenti codici:

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>
16
Ali Gürelli

Cambia il tema dell'attività desiderata. Questo funziona per me:

<activity
            Android:name="HomeActivity"
            Android:screenOrientation="landscape"
            Android:theme="@style/Theme.AppCompat.Light"
            Android:windowSoftInputMode="stateHidden" />
13
sharma_kunal

Se devi estendere ActionBarActivity di cui hai bisogno sul tuo style.xml:

<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

Se imposti come argomento principale la tua applicazione come Android: Theme.Material.Light invece di AppTheme.Base allora riceverai un "IllegalStateException: Devi usare un tema Theme.AppCompat (o discendente) con questo attività "errore.

13
JonasOliveira

Ho avuto un arresto anomalo su Samsung dispositivi anche se l'attività ha utilizzato Theme.AppCompat . La causa principale era legata a strane ottimizzazioni sul lato 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

La mia soluzione stava rimuovendo Android:launchMode="singleTask"

12
goRGon

Ho avuto lo stesso problema, ma risolto quando ho messo questo su manifest: Android: theme = "@ style/Theme.AppCompat.

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/icon"
        Android:label="@string/app_name_test"
        Android:supportsRtl="true"
        Android:theme="@style/Theme.AppCompat">

        ...    

    </application>
12
Marc Baduq

Basta fare

new AlertDialog.Builder(this)

Invece di

new AlertDialog.Builder(getApplicationContext())
9
Ali Akram

per me era la soluzione per usare ContextThemeWrapper:

private FloatingActionButton getFAB() {
Context context = new Android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}

da Android - Come creare FAB a livello di programmazione?

7
Peter

Cambia il tuo genitore stile tema in 

 parent="Theme.AppCompat"

Questo ha funzionato per me ...

6
Fazal

In Android manifest cambia semplicemente il tema dell'attività su AppTheme come segue lo snippet di codice

<activity
  Android:name=".MainActivity"
  Android:label="@string/app_name"
  Android:theme="@style/AppTheme">
</activity>
6
shikha

Ho avuto anche questo problema e quello che ho fatto per risolverlo, E utilizzo ancora il tema di Holo è stato quello di fare questi passi:

prima ho sostituito questa importazione:

import Android.support.v7.app.AppCompatActivity;

con questo:

import Android.app.Activity;

quindi ho cambiato la mia estensione da:

public class MyClass extends AppCompatActivity {//...

a questo:

public class MyClass extends Activity {//...

E ha anche dovuto cambiare questa importazione:

import Android.support.v7.app.AlertDialog;

a questa importazione:

import Android.app.AlertDialog;

e quindi puoi utilizzare il tag del tema nel manifest a livello di attività:

Android:theme="@Android:style/Theme.Holo.Dialog" />

e infine, (a meno che tu non abbia altre classi nel tuo progetto che devono usare v7 appCompat) puoi pulire e ricostruire il tuo progetto o eliminare questa voce nel file gradle build a livello di app:

compile 'com.Android.support:appcompat-v7:23.2.1'

se hai altre classi nel tuo progetto che devono usare appCompat v7, basta pulire e ricostruire il progetto.

6
Wraithious

Questo è quando vuoi un AlertDialog in un frammento 

            AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
            adb.setTitle("My alert Dialogue \n");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                  //some code

            } });
            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                 dialog.dismiss();

                } });
            adb.show();
6
Avinash_ks

Hai molte soluzioni a questo errore.

  1. Dovresti usare Attività o FragmentActivity invece di ActionbarActivity o AppCompatActivity

  2. Se vuoi usare ActionbarActivity o AppCompatActivity , dovresti cambiare in styles.xml Theme.Holo.xxxx a Theme.AppCompat.Light (se necessario aggiungi a DarkActionbar )

Se non hai bisogno di attributi avanzati sulla barra delle azioni o AppCompat non hai bisogno di usare Barra delle azioni o AppCompat .

6
Kaloglu

Questo ha funzionato per me:

<application
           Android:allowBackup="true"
           Android:icon="@mipmap/ic_launcher"
           Android:label="@string/app_name"
           Android:theme="@style/AppTheme" >
           <activity
               Android:name=".MainActivity"
               Android:label="@string/app_name"
               Android:theme="@style/Theme.AppCompat.NoActionBar">

               <intent-filter>
                   <action Android:name="Android.intent.action.MAIN" />

                   <category Android:name="Android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
</application>
5
user1501382

L'attività si sta estendendo ActionBarActivity che richiede il AppCompat.theme da applicare . Modifica da ActionBarActivity a Activity or FragmentActivity , risolverà il problema problema. 

Se non usi alcuna barra delle azioni allora:

Android:theme="@Android:style/Theme.Light.NoTitleBar.Fullscreen" 
5

Siete arrivati ​​a questo perché volete applicare Material Design nello stile del vostro tema nelle versioni precedenti di sdk a 21. ActionBarActivity richiede AppThemeso se volete anche evitare la vostra personalizzazione del vostro AppTheme, solo dovete cambiare nel vostro styles.xml ( precedente a sdk 21) così in questo modo, può ereditare un tema di App Compat.

<style name="AppTheme" parent="Android:Theme.Holo.Light.DarkActionBar">

per questo:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5
danigonlinea

Nelle mie esperienze il problema era il contesto in cui mostravo il mio dialogo . All'interno di un clic del pulsante istanzio un AlertDialog in questo modo:

builder = new AlertDialog.Builder(getApplicationContext());

Ma il contesto non era corretto e ha causato l'errore. L'ho modificato utilizzando il contesto dell'applicazione in questo modo:

Nella sezione di dichiarazione:

Context mContext;

nel metodo onCreate

mContext = this;

E infine nel codice in cui ho bisogno di AlertDialog:

start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
     {
                @Override
                public void onClick(View v)
                {
                    if (!is_running)
                    {
                        builder = new AlertDialog.Builder(mContext);
                        builder.setMessage("MYTEXT")
                                .setCancelable(false)
                                .setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                    Task_Started = false;
                                    startTask();
                                    }
                                })
                                .setNegativeButton("NO",
                                        new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
            }
        }

Questa è la soluzione per me.

4
Dante

Ho avuto un'attività con il tema <Android:theme="@Android:style/Theme.Dialog"> utilizzato per mostrare la finestra di dialogo nel mio appWidget e ho avuto lo stesso problema

ho risolto questo errore modificando il codice dell'attività come di seguito:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}
4
Elyas Nategh

Soluzione rapida.

Cambia il tema principale del tema in styles.xml

Sostituisci da

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

a

<style name="AppTheme" parent="Theme.AppCompat">
4
Kaloglu

Nel mio caso tale problema è apparso quando ho provato a mostrare Dialog . Il problema era nel contesto, ho usato getBaseContext () che teoricamente dovrebbe restituire il contesto di attività, ma non appare, o restituisce il contesto prima di qualsiasi tema applicato.

Quindi ho appena sostituito getBaseContexts () con " this ", e ora funziona come previsto.

        Dialog.showAlert(this, title, message,....);
3
Vitaliy A

Nel mio caso, stavo gonfiando una vista con ApplicationContext. Quando si utilizza ApplicationContext, il tema/stile non viene applicato, quindi, sebbene esistesse Theme.Appcompat nel mio stile, non è stato applicato e ha causato questa eccezione. Ulteriori dettagli: Tema/Stile non viene applicato quando viene utilizzato Inflater con ApplicationContext

3
Murat

Per me nessuna delle risposte sopra ha funzionato anche dopo che avevo Theme.AppCompat come tema base per l'applicazione. Stavo usando com.Android.support:design:24.1.0 Quindi ho appena cambiato la versione in 24.1.1. Dopo la sincronizzazione gradle, funziona di nuovo e l'eccezione è andata via. Mi sembra che il problema fosse con alcune versioni precedenti delle librerie di supporto alla progettazione.

Mettetelo qui nel caso in cui altre risposte non funzionino per alcune persone.

3
Sharp Edge

Stavo ricevendo lo stesso problema. Perché stavo creando un cassetto di navigazione personalizzato. Ma ho dimenticato di menzionare il tema nel mio manifesto in questo modo

Android: theme = "@ stile/Theme.AppCompat.NoActionBar"

Appena ho aggiunto il tema sopra al mio manifest, ha risolto il problema.

3
Azhar osws

Questa soluzione ha funzionato per me. 

La libreria di progettazione dipende dalle librerie di supporto Support v4 e AppCompat, quindi non utilizzare versioni diverse per appcompat e libreria di progettazione in gradle.

uso 

 compile 'com.Android.support:appcompat-v7:23.0.0'
 compile 'com.Android.support:design:23.0.0'

invece di

 compile 'com.Android.support:appcompat-v7:23.0.0'
 compile 'com.Android.support:design:23.1.0'
3
kiran boghra

La mia attività con SectionsPagerAdapter e ViewPager & Fragment

public class MyActivity extends AppCompatActivity implements ActionBar.TabListener
...
...
     @Override
        public void onPostResume(){
            super.onPostResume();
            try {
               getSupportActionBar().setDisplayShowTitleEnabled(false);
            }catch (NullPointerException ignored){
            }
        }
2
valera

Questo mi ha davvero costretto a pubblicare la mia risposta. Dato che sto usando Theme.AppCompat.Light.NoActionBar e ho anche sostituito tutti AlertDialog con support compat importazioni e ho ancora problemi con problemi sotto v21 (Lollipop) . Non mi piaceva l'idea di cambiare tema che fosse corretto . Quindi dopo 2 giorni ho finalmente pensato alle altre librerie specificando AppTheme per il loro AndroidManifest.xml, sì c'era una -> "libreria pgsdk di PayTM" . Quindi, dopo aver risolto i problemi risolti.

  1. Rinominare "AppTheme" utilizzando per la mia app su "XYZAppTheme"
  2. utilizzando strumenti: sostituire il metodo in AndroidManifest del mio progetto (app).

    <uses-permission Android:name="Android.permission.INTERNET" />
    
    <application
        Android:name=".XYZ"
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher_v2"
        Android:label="@string/app_name"
        Android:largeHeap="true"
        Android:roundIcon="@mipmap/ic_launcher_v2_round"
        Android:supportsRtl="true"
        Android:theme="@style/XYZAppTheme"
        tools:replace="Android:icon,Android:theme">
    
        <activity
            Android:name=".xyz.SplashActivity"
            Android:launchMode="singleTask"
            Android:screenOrientation="portrait">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
    
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    

2
Amit Tumkur

Per me problema risolto cambiando l'ereditarietà da AppCompatActivity in Activity nella mia classe customDialog. Nessuna modifica richiesta in manifest per Theme.Dialog. 

2
Kedar

Se si utilizza getApplicationContext () come parametro mentre si gonfia il layout, è possibile provare a utilizzare invece getBaseContext (). per esempio. 

    View.inflate(getBaseContext(),
            getLayoutId() == 0 ? R.layout.page_default : getLayoutId(),
            null);
2
user1744585

Cambia tema dalla scheda evidenziata in picture.  enter image description here

2
saleem kalro

In Android Studio: Aggiungi libreria di supporto al file gradle e sincronizza . Modifica build.gradle (Modulo: app) per avere dipendenze come segue:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:design:23.1.1'
compile 'com.Android.support:support-v4:23.1.1'
}

La mia versione della libreria di supporto è la 23.1.1; Utilizza la versione della tua libreria di supporto come applicabile.

1
CodeBulls Inc.

Nel mio caso, stavo usando uno stile chiamato "FullScreenTheme", e sebbene sembrasse essere definito correttamente (era un discendente di Theme.AppCompat) non funzionava.

Alla fine ho capito che stavo usando una libreria AAR che internamente aveva anche definito uno stile chiamato "FullScreenTheme" e non era discendente di Theme.AppCompat. Lo scontrarsi dei nomi stava causando il problema.

Risolvilo rinominando il mio nome di stile in modo che ora Android stia usando lo stile corretto.

1
tomacco

NOTA: Avevo inteso questo come una risposta, ma ulteriori test rivelano che non funziona ancora quando è stato creato usando maven dalla riga di comando, quindi ho dovuto modificarlo per essere un problema! :-(

Nel mio caso, quando ho ricevuto questo errore, stavo già usando un tema AppCompat e l'errore non aveva molto senso.

Ero in procinto di mavenizing il mio build Android. Avevo già dipendenze dalle versioni apklib e jar dell'app compat, quindi:

    <!-- See https://github.com/mosabua/maven-Android-sdk-deployer -->
        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <version>${compatibility.version}</version>
            <type>apklib</type>
        </dependency>

        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v7</artifactId>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v4</artifactId>
        </dependency>

Ora, quando importare il progetto Maven e creare ed eseguire da IntelliJ va bene.

Ma quando creo e distribuisco ed eseguo dalla riga di comando con Maven, ottengo comunque questa eccezione.

1
Andrew Mackenzie

Nel tuo app/build.gradle aggiungi questa dipendenza:

implementation "com.google.Android.material:material:1.1.0-alpha03"

Aggiorna il tuo genitore styles.xml AppTheme:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"/>
0
Mark Pazon