it-swarm.com.ru

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

Android Studio 0.4.5

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

Если вам нужен пользовательский диалог, вы можете вместо этого отображать Activity в качестве диалога вместо использования Dialog API. Просто создайте действие и установите его тему на 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 для мин:

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>

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

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

848
ant2009

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

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

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


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


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

1028
Bobbake4

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

495
iusting

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

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

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

чтобы: 

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

И проблем больше нет.

211
A.K.

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/

88
Raghunandan

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

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

к этому:

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

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

( Построить -> Очистить проект; Построить -> Восстановить проект; Выполнить -> Выполнить )

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

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

36
Geraldo Neto

Это то, что исправило это для меня: вместо того, чтобы указывать тему в манифесте, я определил ее в 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.

24
k29

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

parent="Theme.AppCompat"

вместо 

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

В моем случае у меня нет файла values-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>
16
Ali Gürelli

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

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

Если вам нужно расширить 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 (или потомок) с этим активность »ошибка.

13
JonasOliveira

У меня был такой сбой на устройствах 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"

12
goRGon

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

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

new AlertDialog.Builder(this)

Вместо

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

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

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

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

7
Peter

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

 parent="Theme.AppCompat"

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

6
Fazal

В манифесте Android просто измените тему действия на AppTheme, как показано ниже.

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

У меня была и эта проблема, и что я сделал, чтобы ее исправить, И все еще использовал тему 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, просто очистите и пересоберите проект.

6
Wraithious

Это когда вы хотите 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();
6
Avinash_ks

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

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

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

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

6
Kaloglu

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

<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

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

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

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

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

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

за это:

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

По моему опыту, проблема заключалась в том, что я показывал свой диалог…. Внутри нажатия кнопки я создаю экземпляр 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();
                    }
            }
        }

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

4
Dante

У меня была активность с темой <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);
}
4
Elyas Nategh

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

Измените родительский элемент вашей базовой темы в styles.xml

Заменить от

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

в

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

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

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

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

В моем случае я раздувал представление с помощью ApplicationContext. Когда вы используете ApplicationContext, тема/стиль не применяется, поэтому, хотя в моем стиле был Theme.Appcompat, он не был применен и вызвал это исключение. Подробнее: Тема/Стиль не применяется, когда инфлятор используется с ApplicationContext

3
Murat

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

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

3
Sharp Edge

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

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

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

3
Azhar osws

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

Библиотека дизайна зависит от Support v4 и библиотек поддержки AppCompat, поэтому не используйте другую версию для appcompat и библиотеки дизайна в 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'
3
kiran boghra

Моя активность с SectionsPagerAdapter и 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

Это действительно заставило меня опубликовать свой собственный ответ. Так как я использую Theme.AppCompat.Light.NoActionBar, а также заменил все AlertDialog на импорт поддерживаемых компатов и все еще столкнулся с проблемами ниже v21 (Lollipop)…. Мне не понравилась идея сменить тему, которая была правильной…. Через 2 дня я наконец-то подумал о том, что другие библиотеки указали AppTheme для их AndroidManifest.xml, да, была одна -> «Библиотека PayTM pgsdk» . Поэтому следующие изменения устранили проблему.

  1. Переименование AppTheme с помощью моего приложения в XYZAppTheme
  2. с помощью инструментов: заменить метод в AndroidManifest моего проекта (приложения).

    <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

Для меня проблема решена путем изменения наследования от AppCompatActivity на Activity в моем классе customDialog. Никаких изменений не требуется в манифесте для Theme.Dialog. 

2
Kedar

Если вы используете getApplicationContext () в качестве параметра при накачивании макета, вы можете попробовать использовать getBaseContext (). например 

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

Измените тему из выделенной вкладки на картинке .  enter image description here

2
saleem kalro

В Android Studio: Добавьте библиотеку поддержки в файл Gradle и синхронизируйте . Отредактируйте build.gradle (Module: app), чтобы иметь зависимости следующим образом:

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

Моя библиотека поддержки версии 23.1.1; Используйте версию вашей библиотеки поддержки, если применимо.

1
CodeBulls Inc.

В моем случае я использовал стиль под названием «FullScreenTheme», и, хотя он, казалось, был правильно определен (это был потомок Theme.AppCompat), он не работал.

В конце концов я понял, что использую библиотеку AAR, которая внутренне также определила стиль под названием «FullScreenTheme» и это не было потомок Theme.AppCompat. Столкновение имен было причиной проблемы.

Исправьте это, переименовав мое собственное имя стиля, так что теперь Android использует правильный стиль.

1
tomacco

ПРИМЕЧАНИЕ. Я задумал это как ответ, но дальнейшее тестирование показало, что он все равно не работает при сборке с использованием maven из командной строки, поэтому мне пришлось отредактировать его, чтобы создать проблему! :-(

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

Я находился в процессе создания своего Android-билда. У меня уже были зависимости от apklib и jar-версий приложения compat, таким образом:

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

Теперь, когда я импортирую проект maven, собираю и запускаю из IntelliJ, все нормально.

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

1
Andrew Mackenzie

В вашем app/build.gradle добавьте эту зависимость:

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

Обновите ваш styles.xml родительский объект AppTheme:

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