android - Necesita usar un tema Theme.AppCompat (o descendiente) con esta actividad


Android Studio 0.4.5

Documentación de Android para crear cuadros de diálogo personalizados: http://developer.android.com/guide/topics/ui/dialogs.html

Si desea un cuadro de diálogo personalizado, puede mostrar una Actividad como un cuadro de diálogo en lugar de utilizar las API de Diálogo. Simplemente cree una actividad y establezca su tema en Theme.Holo.Dialog en el elemento de manifiesto <activity> :

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

Sin embargo, cuando probé esto, recibí la siguiente excepción:

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

Estoy apoyando lo siguiente, y no puedo usar algo superior a 10 para el mínimo:

minSdkVersion 10
targetSdkVersion 19

En mis estilos tengo lo siguiente:

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

Y en mi manifiesto tengo esto para la actividad:

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

Crear un cuadro de diálogo como este era algo que estaba deseando hacer, ya que ya completé el diseño.

¿Alguien puede decirme cómo puedo solucionar este problema?


Answers



La razón por la que tiene este problema es porque la actividad a la que intenta aplicar el tema del diálogo extiende ActionBarActivity que requiere que se AppCompat tema de AppCompat .

Actualización : la extensión de AppCompatActivity también tendría este problema

En este caso, cambie la herencia de Java de ActionBarActivity a Activity y deje el tema del diálogo en el manifiesto como está, un valor no Theme.AppCompat

La regla general es que si desea que su código admita versiones anteriores de Android, debe tener el tema AppCompat y el código Java debe extender AppCompatActivity . Si tiene * una actividad que no necesita este soporte, como que solo le interesan las últimas versiones y funciones de Android, puede aplicar cualquier tema, pero el código de Java debe extender la Activity antigua.

NOTA: Cuando cambie de AppCompatActivity (o una subclase, ActionBarActivity ) a Activity , también debe cambiar las diversas llamadas con "soporte" a la llamada correspondiente sin "soporte". Entonces, en lugar de getSupportFragmentManager , llama a getFragmentManager .




Todo lo que necesita hacer es agregar android:theme="@style/Theme.AppCompat.Light" a su etiqueta de aplicación en el archivo AndroidManifest.xml .




Copiando respuesta de @MarkKeen en los comentarios anteriores ya que tuve el mismo problema.

Tuve el error indicado en la parte superior de la publicación y ocurrió después de que agregué un cuadro de diálogo de alerta. Tengo toda la información de estilo relevante en el manifiesto. Mi problema se solucionó cambiando una referencia de contexto en el generador de alertas. Cambié:

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

a:

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

Y no más problemas




min sdk es 10. ActionBar está disponible desde el nivel 11 de api. Por lo tanto, para 10 AppCompat usando AppCompat desde la biblioteca de soporte para la que necesitas usar Theme.AppCompat o un descendiente de la misma.

Utilizar

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

Más información @

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

Eidt:

Podría haber leído mal la publicación op.

Parece que op quiere un Diálogo con un Tema de Actividad. Entonces, como ya sugirió Bobbake4 extienda Activity lugar de ActionBarActivity .

También tenga un aspecto @ Atributos del cuadro de diálogo en el siguiente enlace

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




Esto funcionó para mí, acabo de cambiar:

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

a esto:

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



Esto es lo que me solucionó: en lugar de especificar el tema en manifiesto, lo onCreate en onCreate para cada actividad que amplía ActionBarActivity :

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

Aquí MyAppTheme es un descendiente de Theme.AppCompat , y se define en xml. Tenga en cuenta que el tema debe establecerse antes de super.onCreate y setContentView .




ve a tus estilos y pon el padre

parent="Theme.AppCompat"

en lugar de

parent="@android:style/Theme.Holo.Light"



Estaba experimentando este problema a pesar de que mi tema era un tema de AppCompat y mi actividad era una actividad de AppCompatActivity (o Activity , como se sugiere en las respuestas de los demás). Así que limpié, reconstruí y volví a ejecutar el proyecto.

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

Puede parecer tonto, ¡pero ahora funciona genial !

¡Solo espero que ayude!




Si necesita extender ActionBarActivity necesita en su style.xml:

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

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

Si establece como tema principal de su aplicación como android: Theme.Material.Light en lugar de AppTheme.Base , obtendrá un "IllegalStateException: debe utilizar un tema Theme.AppCompatpat (o descendiente) con esta actividad" error.




Tuve tal caída en los dispositivos de Samsung a pesar de que la actividad usó Theme.AppCompat . La causa raíz estaba relacionada con optimizaciones extrañas en el lado de 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

Mi solución fue simplemente eliminar android:launchMode="singleTask"




Tuve el mismo problema, pero se resolvió cuando puse esto en manifiesto: 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>



En mi caso, no tengo ningún archivo values-v21 en mi directorio res. Luego lo creé y agregué en él los siguientes códigos:

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



Cambia el tema de la actividad deseada. Su trabajo para mí

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



En el manifiesto de Android simplemente cambia el tema de actividad a AppTheme como sigue el fragmento de código

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



Ha llegado a esto porque quiere aplicar Material Design en su estilo de tema en versiones sdk anteriores a 21. ActionBarActivity requiere AppTheme así que si también quiere evitar su propia personalización sobre su AppTheme, solo tiene que cambiar en su styles.xml (anterior a sdk 21) de esta manera, puede heredar para un tema de compatibilidad de aplicaciones.

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

para esto:

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



Cambia tu estilo de tema padre a

 parent="Theme.AppCompat"

Esto funcionó para mí ...




Este trabajó para mí:

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



Usted tiene muchas soluciones para ese error.

  1. Debe usar Activity o FragmentActivity en lugar de ActionbarActivity o AppCompatActivity

  2. Si desea utilizar ActionbarActivity o AppCompatActivity , debe cambiar en styles.xml Theme.Holo.xxxx a Theme.AppCompat.Light (si es necesario, agregue a DarkActionbar )

Si no necesita atributos avanzados sobre la barra de acciones o AppCompat , no necesita usar la barra de acciones o AppCompat .




Su actividad está extendiendo ActionBarActivity, que requiere la aplicación de AppCompat.theme . Cambiar de ActionBarActivity a Activity o FragmentActivity , resolverá el problema.

Si no usas ninguna barra de acción, entonces:

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



para mí fue una solución para usar ContextThemeWrapper:

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

de Android - ¿Cómo crear FAB mediante programación?




Esto es cuando quieres un AlertDialog en un Fragmento

            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();



También tuve este problema y lo que hice para solucionarlo Y TODAVÍA usar el tema Holo fue seguir estos pasos:

primero reemplacé esta importación:

import android.support.v7.app.AppCompatActivity;

Con este:

import android.app.Activity;

luego cambié mi extensión de:

public class MyClass extends AppCompatActivity {//...

a esto:

public class MyClass extends Activity {//...

Y también tuvo que cambiar esta importación:

import android.support.v7.app.AlertDialog;

a esta importación:

import android.app.AlertDialog;

y luego puedes usar tu etiqueta de tema en el manifiesto en el nivel de actividad:

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

y, por último, (a menos que tenga otras clases en su proyecto que tengan que usar v7 appCompat) puede limpiar y reconstruir su proyecto o eliminar esta entrada en el archivo de compilación gradle a nivel de la aplicación:

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

si tiene otras clases en su proyecto que tienen que usar v7 appCompat, simplemente limpie y vuelva a generar el proyecto.




Mi actividad con SectionsPagerAdapter y ViewPager & Fragment

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



Esta solución funcionó para mí.

La biblioteca de diseño depende del Soporte v4 y de las Bibliotecas de soporte de AppCompat, por lo que no debe usar una versión diferente para el appcompat y la biblioteca de diseño en gradle.

utilizar

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

en lugar de

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.1.0'



Solución rápida

Cambia tu padre del tema base en styles.xml

Reemplazar de

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

a

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



Estaba teniendo el mismo problema Porque estaba creando un cajón de navegación personalizado. Pero me olvido de mencionar el tema en mi manifiesto como este

android: theme = "@ style / Theme.AppCompat.NoActionBar"

Tan pronto agregué el tema a mi manifiesto, resolví el problema.




NOTA: Tuve la intención de que esto fuera una respuesta, pero pruebas posteriores revelan que aún falla cuando se crea con Maven desde la línea de comandos, ¡así que tuve que editarlo para ser un problema! :-(

En mi caso, cuando recibí este error, ya estaba usando un tema de AppCompat y el error no tenía mucho sentido.

Estaba en el proceso de mavenizar mi build de Android. Ya tenía dependencias en las versiones apklib y jar de la aplicación compat, por lo tanto:

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

Ahora, cuando importo el proyecto maven y lo construyo y ejecuto desde IntelliJ, está bien.

Pero cuando construyo e implemento y corro desde la línea de comando con maven, sigo recibiendo esta excepción.




En Android Studio: agregue la biblioteca de soporte al archivo gradle y sincronícela. Edite build.gradle (Module: app) para tener dependencias de la siguiente manera:

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

Mi versión de la biblioteca de soporte es 23.1.1; Use su versión de la biblioteca de soporte según corresponda.




Para mí, el problema se resolvió al cambiar la herencia de AppCompatActivity a Activity en mi clase customDialog. No se requieren cambios en el manifiesto para Theme.Dialog.




Para mí, ninguna de las respuestas anteriores funcionó incluso después de tener Theme.AppCompat como mi tema base para la aplicación. Estaba usando com.android.support:design:24.1.0 Así que acabo de cambiar la versión a 24.1.1 . Después de la sincronización gradle, se volvió a trabajar y la excepción desapareció. Me parece que el problema fue con algunas versiones anteriores de las bibliotecas de soporte de diseño.

Solo poniendo esto aquí en caso de que otras respuestas no funcionen para algunas personas.