Вы должны использовать тему 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"
Как только я добавил указанную выше тему к моему манифесту, она решила проблему.