Вам нужно использовать тему 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>
Создание такого диалогового окна было чем-то, что я прыгал, поскольку я уже закончил макет.
Может кто-нибудь сказать мне, как я могу обойти эту проблему?
65 ответов
Причиной возникновения этой проблемы является то, что действие, к которому вы пытаетесь применить тему диалога, расширяется ActionBarActivity
который требует AppCompat
тема для применения.
Обновление: Расширение AppCompatActivity
также будет иметь эту проблему
В этом случае измените наследование Java с ActionBarActivity
в Activity
и оставить тему диалога в манифесте как есть, не Theme.AppCompat
значение
Общее правило: если вы хотите, чтобы ваш код поддерживал более старые версии Android, он должен иметь AppCompat
тема и код Java должны расширяться AppCompatActivity
, Если у вас есть * действие, которое не нуждается в этой поддержке, например, если вы заботитесь только о последних версиях и функциях Android, вы можете применить к нему любую тему, но код java должен расширять старый Activity
,
ПРИМЕЧАНИЕ. При изменении AppCompatActivity
(или подкласс, ActionBarActivity
), чтобы Activity
Необходимо также изменить различные вызовы с "поддержкой" на соответствующий вызов без "поддержки". Итак, вместо getSupportFragmentManager
, вызов getFragmentManager
,
Все, что вам нужно сделать, это добавить android:theme="@style/Theme.AppCompat.Light"
на ваш тег приложения в AndroidManifest.xml
файл.
Копирование ответа от @MarkKeen в комментариях выше, так как у меня была та же проблема.
У меня была ошибка, указанная в верхней части сообщения, и произошла после того, как я добавил диалоговое окно предупреждения. У меня есть вся соответствующая информация о стиле в манифесте. Моя проблема была исправлена путем изменения ссылки на контекст в конструкторе оповещений - я изменил:
new android.support.v7.app.AlertDialog.Builder(getApplicationContext())
чтобы:
new android.support.v7.app.AlertDialog.Builder(this)
И проблем больше нет.
Это сработало для меня, я просто изменился:
final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
к этому:
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
Мин СДК 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
,
Также посмотрите @ Атрибуты диалога в ссылке ниже
Я испытывал эту проблему, хотя моя тема была AppCompat
Тема и моя активность была AppCompatActivity
(или же Activity
, как подсказывают другие ответы). Поэтому я почистил, перестроил и снова запустил проект.
(Построить -> Очистить проект; Построить -> Перестроить проект; Выполнить -> Выполнить)
Это может показаться глупым, но теперь это прекрасно работает!
Надеюсь, это поможет!
Это то, что исправило это для меня: вместо того, чтобы указывать тему в манифесте, я определил это в 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
,
Перейти к своим стилям и поставить родителя
parent="Theme.AppCompat"
вместо
parent="@android:style/Theme.Holo.Light"
Измените тему желаемого занятия. Это работает для меня:
<activity
android:name="HomeActivity"
android:screenOrientation="landscape"
android:theme="@style/Theme.AppCompat.Light"
android:windowSoftInputMode="stateHidden" />
В моем случае у меня нет файла 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>
Просто делать
new AlertDialog.Builder(this)
Вместо
new AlertDialog.Builder(getApplicationContext())
Для меня решение, попробовав все решения отсюда, заключалось в том, чтобы изменить
<activity
android:name="com.github.cythara.MainActivity"
android:label="Main">
</activity>
включить тему:
<activity
android:name="com.github.cythara.MainActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:label="Main">
</activity>
У меня был такой сбой на устройствах 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"
Если вам нужно расширить 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. -->
Если вы установите в качестве основной темы своего приложения андроид:Theme.Material.Light вместо AppTheme.Base, вы получите сообщение об ошибке "IllegalStateException: вам необходимо использовать тему Theme.AppCompat (или потомок) с этим действием".
У меня была та же проблема, но она решена, когда я поместил это в манифест: 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>
В моем случае такая проблема возникла, когда я пытался показать диалог. Проблема была в контексте, я использую getBaseContext(), который теоретически должен возвращать контекст Activity, но, по-видимому, его нет, или он возвращает контекст до применения любой темы.
Поэтому я просто заменил getBaseContexts() на "this", и теперь он работает как положено.
Dialog.showAlert(this, title, message,....);
В случае AndroidX
SplashScreen
привел тебя сюда ...
Это потому, что также нет
R.styleable.AppCompatTheme_windowActionBar
:
if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
a.recycle();
throw new IllegalStateException(
"You need to use a Theme.AppCompat theme (or descendant) with this activity.");
}
Это требует переключения темы на
postSplashScreenTheme
, перед звонком
super()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
/* When switching the theme to dark mode. */
if (savedInstanceState != null) {
this.setTheme(R.style.AppTheme);
}
super.onCreate(savedInstanceState);
/* When starting the Activity. */
if (savedInstanceState == null) {
SplashScreen.installSplashScreen(this);
}
}
Тогда
Theme.SplashScreen
из
AndroidManifest.xml
не будет мешать.
У меня была активность с темой <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);
}
Вы пришли к этому, потому что хотите применить Material Design в стиле вашей темы в предыдущих версиях SDK до 21. ActionBarActivity
требует AppTheme
поэтому, если вы также хотите запретить свою собственную настройку для вашей AppTheme, только вы должны изменить свой файл styles.xml (до sdk 21), чтобы таким образом можно было наследовать тему App Compat.
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
за это:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
Убедитесь, что вы используете контекст действия при создании нового диалогового окна предупреждений, а не приложение или базовый контекст.
У меня была и эта проблема, и что я сделал, чтобы ее исправить, и все еще использовал тему 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, просто очистите и пересоберите проект.
Для меня было решением использовать ContextThemeWrapper:
private FloatingActionButton getFAB() {
Context context = new android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}
В манифесте Android просто измените тему действия на AppTheme, как показано ниже.
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme">
</activity>
Я столкнулся с той же проблемой.
Если вы предоставляете контекст для любого класса или метода, укажите YourActivityName.this вместо getApplicationContext().
Сделай это
builder = new AlertDialog.Builder(YourActivity.this);
Вместо того
builder = new AlertDialog.Builder(getApplicationContext());
У меня была такая же проблема. Потому что я создавал пользовательский навигационный ящик. Но я забыл упомянуть тему в моем манифесте, как это
Android: тема ="@ стиль /Theme.AppCompat.NoActionBar"
Как только я добавил вышеупомянутую тему в мой манифест, это решило проблему.
Этот работал для меня:
<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>
У вас есть много решений этой ошибки.
Вы должны использовать Activity или FragmentActivity вместо ActionbarActivity или AppCompatActivity
Если вы хотите использовать ActionbarActivity или AppCompatActivity, вам нужно изменить в styles.xml Theme.Holo.xxxx на Theme.AppCompat.Light (при необходимости добавить в DarkActionbar)
Если вам не нужны расширенные атрибуты о панели действий или AppCompat, вам не нужно использовать Actionbar или AppCompat.
В моем опыте проблема заключалась в том, что я показывал свой диалог. Внутри нажатия кнопки я создаю экземпляр 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();
}
}
}
Это решение для меня.
Это когда вы хотите 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();
Измените свой родительский стиль темы на
parent="Theme.AppCompat"
Это сработало для меня...