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

Я использую appcompat v22.1.0 в своем приложении и использую панель инструментов. Все было хорошо, когда я использую Theme.AppCompat.Light.NoActionBar, Когда я начну реализовывать AlertDialog, это производит ошибку как это:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
        at android.support.v7.app.AppCompatDelegateImplBase.onCreate(AppCompatDelegateImplBase.java:113)
        at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:146)
        at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:47)
        at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:92)
        at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:882)
        at com.ramabmtr.map.findingmoo.MainActivity.onOptionsItemSelected(MainActivity.java:216)
        at android.app.Activity.onMenuItemSelected(Activity.java:2572)
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353)
        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:144)
        at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:99)
        at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:99)
        at android.support.v7.internal.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:74)
        at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:164)
        at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:740)
        at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:802)
        at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:939)
        at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:598)
        at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139)
        at android.view.View.performClick(View.java:4084)
        at android.view.View$PerformClick.run(View.java:16989)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4812)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559)
        at dalvik.system.NativeStart.main(Native Method)

На основании этой ошибки я изменяю свою тему на Theme.AppCompat и положить это:

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

к моей теме. Но это выдает ту же ошибку.

Style.xml (старый)

<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
</resources>

Style.xml (новый)

<resources>
<style name="AppTheme" parent="Theme.AppCompat">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
</resources>

Кто-нибудь знает, как это исправить??

MainActivity.java

package com.ramabmtr.map.findingmoo;

import android.content.DialogInterface;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TextView toolbarTitle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/panpizza.ttf");
    toolbarTitle = (TextView) findViewById(R.id.toolbar_title);
    toolbarTitle.setTypeface(myTypeface);

    AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
    builder.setTitle(R.string.filter_title);
    builder.setMessage("test");
    builder.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });
    builder.setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}
}

15 ответов

Решение

В основном ваша активность использует панель инструментов (которая заменяет панель действий), поэтому вам нужно использовать стиль для деятельности, у которой нет панели действий, например Theme.AppCompat.Light.NoActionBar, Если у вас есть свой собственный стиль диалога, вам нужно унаследовать правильную тему AppCompat.

<style name="myDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    ...
</style>

AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));

Исправлена ​​моя проблема с использованием MainActivity.this (или YourActivityName.this)

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);

Убедитесь, что вы уже Theme.AppCompat и расширяете AppCompatActivity.

В моем случае эта авария была вызвана тем, что я проходил мимо View.getContext().getApplicationContext() как Context к Builder, Это было исправлено с помощью getActivity() вместо.

Увидел это же исключение, используя Activity а также Theme.Light тема. У меня была проблема с неправильным импортом, я использовал службу поддержки. import android.support.v7.app.AlertDialog; вместо import android.app.AlertDialog;

Если у вас есть эта ошибка при создании диалога (только в моем случае), вы должны использовать следующее:

AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Light);

вместо:

AlertDialog.Builder dialog = new AlertDialog.Builder(context);

Это сработало у меня отлично!

Эта работа для меня... после прочтения несколько ответ был...

Измените мой импорт следующим образом:

import android.app.AlertDialog;

вместо

import android.support.v7.app.AlertDialog; 

это приводит к ошибке Невозможно добавить окно - токен null не для приложения... поэтому я изменяю контекст компоновщика с

AlertDialog.Builder builder = new 

AlertDialog.Builder(getAplicationContext()); в

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

Проблема связана с контекстом, который вы передаете для создания диалогового окна оповещения. Не используйте getApplicationContext(). Попробуйте использовать свой контекст Activity.Use AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);

Добавление Android:theme="@style/Theme.AppCompat" как это в манифесте

<activity
    android:theme="@style/Theme.AppCompat"
    android:name=".MainActivity"

решил проблему

Просто укажите свою активность здесь:

       AlertDialog.Builder builder = new AlertDialog.Builder(your_activity.this);

вместо

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

В котлине это сработало для меня:

val dialog = AlertDialog.Builder(this)

Если вы используете библиотеку поддержки, ваша деятельность расширяется AppCompactActivity, если вы используете android studio для создания активности это по умолчанию. В таком случае передайте контекст разработчику ActivityName.this или просто this если вы передаете его в onCreate, проходя getApplicationContext() не будет работать.

Это мой стиль с использованием appcompact

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textSize">18sp</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

И все работает нормально, когда я использую this или же ActivityName.this как уже упоминалось выше.

Если вы используете фрагмент, вы должны пройти getActivity() как контекст для строителя вместо getContext(),

Вы должны передать контекст своей деятельности вместо того, чтобы передать свой контекст. Попробуйте с "этим" вместо "контекста". Это работа для меня

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

проблема была вызвана этой строкой:

 <style name="LooperLabTheme"
        parent.theme="@style/Theme.AppCompat.Light.NoActionBar"
        theme="@style/Theme.AppCompat.Light.NoActionBar">
<style/>

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

 <style name="LooperLabTheme"
            parent="@style/Theme.AppCompat.Light.NoActionBar"
            theme="@style/Theme.AppCompat.Light.NoActionBar">
    <style/>

Я просто хочу помочь другим, которые бегут от потока к потоку, найти решение для его очень специфической проблемы, которая может быть такой же, как моя, сэкономить ваше время.

getSupportActionBar().getThemedContext()

AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext(), android.R.style.Theme_Material_Dialog_Alert);
} else {
    builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext());
}
builder.setTitle("Alert Dialog")
       .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

            }
        })
       .setIcon(android.R.drawable.ic_dialog_alert)
       .show();

В моем случае мне пришлось проверить и убедиться, что все файлы styles.xml используют Theme.AppCompat, Эта тема была в стандартном файле styles.xml, но были также сгенерированные автоматически стили (v21).xml, styles(v11).xml и styles(sw600dp).xml. Простым решением было бы скопировать и вставить настроенный стиль AppTheme по умолчанию в эти папки.

Всего наилучшего!

Другие вопросы по тегам