Вы должны использовать тему Theme.AppCompat(или потомок) с этим действием

Android Studio 0.4.5

Документация для создания пользовательских диалоговых окон для Android: http://developer.android.com/guide/topics/ui/dialogs.html

Если вы хотите создать настраиваемый диалог, вместо использования диалоговых окон Dialog вы можете вместо этого отображать диалоговое окно "Активность как диалог". Просто создайте действие и установите его тему в Theme.Holo.Dialog в элемент манифеста <activity>:

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

Однако, когда я это пробовал, я получаю следующее исключение:

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

Я поддерживаю следующее, и я не могу использовать что-то большее, чем 10 для min:

minSdkVersion 10
targetSdkVersion 19

В моих стилях у меня есть следующее:

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

И в моем манифесте у меня есть это для деятельности:

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

Создание диалогового окна, подобного этому, было чем-то, что я прыгал, поскольку я уже завершил компоновку.

Может ли кто-нибудь сказать мне, как я могу обойти эту проблему?

Ответ 1

Причина, по которой у вас возникает эта проблема, заключается в том, что действие, которое вы пытаетесь применить к теме диалога, распространяется на ActionBarActivity, для которого требуется использовать тему AppCompat.

Обновление: расширение AppCompatActivity также будет иметь эту проблему

В этом случае измените наследование Java от ActionBarActivity до Activity и оставьте тему диалога в манифесте как есть, значение Theme.AppCompat


Общее правило заключается в том, что если вы хотите, чтобы ваш код поддерживал старые версии Android, он должен иметь тему AppCompat, а java-код должен расширять AppCompatActivity. Если у вас есть * деятельность, которая не нуждается в этой поддержке, например, вы заботитесь только о последних версиях и функциях Android, вы можете применить к ней любую тему, но код Java должен распространять простой старый Activity.


ПРИМЕЧАНИЕ. При изменении от AppCompatActivity (или подкласса ActionBarActivity) до Activity также необходимо изменить различные вызовы с "поддержкой" на соответствующий вызов без "поддержки". Итак, вместо getSupportFragmentManager вызовите getFragmentManager.

Ответ 2

Все, что вам нужно сделать, это добавить android:theme="@style/Theme.AppCompat.Light" в свой тег приложения в файле AndroidManifest.xml.

Ответ 3

Копирование ответа от @MarkKeen в комментарии выше, поскольку у меня была та же проблема.

У меня была ошибка, указанная в верхней части сообщения и произошла после того, как я добавил диалоговое окно предупреждения. У меня есть вся соответствующая информация стиля в манифесте. Моя проблема была устранена путем изменения ссылки на контекст в построителе предупреждений - я изменил:

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

to:

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

И больше никаких проблем.

Ответ 4

min sdk - 10. ActionBar доступен с уровня API 11. Для 10 вы должны использовать AppCompat из библиотеки поддержки, для которой вам нужно использовать Theme.AppCompat или его потомка.

Используйте

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

Или, если вы не хотите панель действий вверху

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

Подробнее @

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

Изменить:

Возможно, я неправильно прочитал сообщение.

Кажется, что ОП хочет диалог с темой деятельности. Так как уже предложено Bobbake4, расширьте Activity вместо ActionBarActivity.

Также посмотрите @Атрибуты диалога в ссылке ниже

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

Ответ 5

Это сработало для меня, я просто изменил:

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

:

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

Ответ 6

У меня возникла эта проблема, хотя моя тема была темой AppCompat, а моя активность была AppCompatActivity (или Activity, как было предложено в других ответах). Поэтому я очистил, перестроил и повторил проект.

(Build → Clean Project, Build → Rebuild Project, Run → Run)

Это может показаться немым, но теперь он отлично работает!

Просто надеюсь, что это поможет!

Ответ 7

Это то, что исправило это для меня: вместо указания темы в манифесте я определил ее в onCreate для каждого действия, которое расширяет ActionBarActivity:

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

Здесь MyAppTheme является потомком Theme.AppCompat и определяется в xml. Обратите внимание, что тема должна быть установлена ​​до super.onCreate и setContentView.

Ответ 8

перейдите к вашим стилям и поместите родительский

parent="Theme.AppCompat"

вместо

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

Ответ 9

В моем случае у меня нет файлов значений-v21 в каталоге res. Затем я создал его и добавил в него следующие коды:

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

Ответ 10

Если вам нужно расширить ActionBarActivity, вам понадобится ваш style.xml:

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

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

Если вы задали главную тему своего приложения как android: Theme.Material.Light вместо AppTheme.Base, тогда вы получите "IllegalStateException: вам нужно использовать тему Theme.AppCompat(или потомок) с этой ошибкой активности.

Ответ 11

Измените тему желаемого действия. Это работает для меня:

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

Ответ 12

У меня был такой сбой на устройствах Samsung, хотя в действии использовался Theme.AppCompat. Основная причина была связана со странной оптимизацией со стороны 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

Мое решение просто удаляло android:launchMode="singleTask"

Ответ 13

У меня была та же проблема, но она решилась, когда я положил это на манифест: 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>

Ответ 14

Просто делать

new AlertDialog.Builder(this)

Вместо

new AlertDialog.Builder(getApplicationContext())

Ответ 15

для меня было решение использовать ContextThemeWrapper:

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

from Android - Как программно создать FAB?

Ответ 16

У меня была активность с темой <android:theme="@android:style/Theme.Dialog"> используемой для отображения диалога в моем приложении appWidget, и у меня была такая же проблема

Я решил эту ошибку, изменив код операции, как показано ниже:

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

Ответ 17

У меня тоже была эта проблема, и что я сделал, чтобы исправить ее, и по-прежнему использую тему Holo, чтобы выполнить следующие действия:

сначала я заменил этот импорт:

import android.support.v7.app.AppCompatActivity;

с этим:

import android.app.Activity;

а затем изменил расширение:

public class MyClass extends AppCompatActivity {//...

:

public class MyClass extends Activity {//...

И также пришлось изменить этот импорт:

import android.support.v7.app.AlertDialog;

для этого импорта:

import android.app.AlertDialog;

а затем вы можете использовать свой тег темы в манифесте на уровне активности:

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

и, наконец, (если у вас нет других классов в вашем проекте, которые должны использовать v7 appCompat), вы можете очистить и перестроить проект или удалить эту запись в файле сборки gradle на уровне приложения:

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

Если у вас есть другие классы в вашем проекте, которые должны использовать v7 appCompat, тогда просто очистите и перестройте проект.

Ответ 18

В моем случае такая проблема возникла, когда я попытался показать Dialog. Проблема была в контексте, я использую getBaseContext(), который теоретически должен возвращать контекст Activity, но появляется его не, или он возвращает контекст до применения любой темы.

Поэтому я просто заменил getBaseContexts() на " this ", и теперь он работает так, как ожидалось.

        Dialog.showAlert(this, title, message,....);

Ответ 19

Вы пришли к этому, потому что хотите применить Material Design в своем стиле темы в предыдущих версиях sdk до 21. ActionBarActivity требует AppTheme, поэтому, если вы также хотите предотвратить собственную настройку своего AppTheme, только у вас есть для изменения в ваших styles.xml(до sdk 21), чтобы этот способ мог наследовать тему приложения.

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

для этого:

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

Ответ 20

Измените родительский стиль стиля на

 parent="Theme.AppCompat"

Это сработало для меня...

Ответ 21

У вас много решений этой ошибки.

  • Вы должны использовать Activity или FragmentActivity вместо ActionbarActivity или AppCompatActivity

  • Если вы хотите использовать ActionbarActivity или AppCompatActivity, вам следует изменить в styles.xml Theme.Holo.xxxx на Theme.AppCompat.Light(при необходимости добавить в DarkActionbar)

Если вам не нужны расширенные атрибуты панели действий или AppCompat, вам не нужно использовать Actionbar или AppCompat.

Ответ 22

В Android-манифесте просто измените тему активности на AppTheme, следуя фрагменту кода

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

Ответ 23

Это когда вам нужен AlertDialog в фрагменте

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

Ответ 24

В моем опыте проблема была в контексте, где я показал свой диалог. Внутри нажатия кнопки я создаю AlertDialog следующим образом:

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

Но контекст был неправильным и вызвал ошибку. Я изменил его с помощью контекста приложения следующим образом:

В разделе объявления:

Context mContext;

в методе onCreate

mContext = this;

И, наконец, в коде, где мне нужен 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();
                    }
            }
        }

Это решение для меня.

Ответ 25

Это работало для меня:

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

Ответ 26

В вашей деятельности расширяется ActionBarActivity, для которой требуется AppCompat.theme. Из ActionBarActivity на Активность или FragmentActivity это решит проблему.

Если вы не используете панель действий, то:

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

Ответ 27

Быстрое решение.

Измените родительскую родительскую тему в styles.xml

Заменить из

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

к

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

Ответ 28

Это решение сработало для меня.

Библиотека дизайна зависит от библиотек поддержки поддержки v4 и AppCompat, поэтому не используйте другую версию для библиотеки appcompat и design в gradle.

использовать

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

вместо

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

Ответ 29

Для меня ни один из вышеперечисленных ответов не работал даже после того, как у меня была Theme.AppCompat в качестве базовой темы для приложения. Я использовал com.android.support:design:24.1.0. Поэтому я просто изменил версию на 24.1.1. После синхронизации gradle его работа снова и исключение исчезло. Кажется, проблема связана с некоторыми более старыми версиями библиотек поддержки дизайна.

Просто поместите это здесь, если другие ответы не сработают для некоторых людей.

Ответ 30

У меня была такая же проблема. Потому что я создавал пользовательский навигационный ящик. Но я забыл упомянуть тему в моем манифесте, подобном этому

Android: тема = "@стиль/Theme.AppCompat.NoActionBar"

Как только я добавил указанную выше тему к моему манифесту, она решила проблему.