您需要为此 activity 使用 Theme.AppCompat 主题(或后代)。更改为 Theme.AppCompat 会导致其他错误

You need to use a Theme.AppCompat theme (or descendant) with this activity. Change to Theme.AppCompat causes other error

我在我的应用程序中使用 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.onMenuItemClick(ToolbarActionBar.java:74)
        at android.support.v7.widget.Toolbar.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();
}
}

基本上您的 Activity 使用的是工具栏(它取代了操作栏),因此您需要为没有操作栏的 Activity 使用样式 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));

就我而言,这次崩溃是因为我将 View.getContext().getApplicationContext() 作为 Context 传递给 Builder。这是通过使用 getActivity() 来解决的。

使用 ActivityTheme.Light 主题发现了同样的异常。我的问题是导入错误,我使用的是支持导入。 import android.support.v7.app.AlertDialog; 而不是 import android.app.AlertDialog;

使用 MainActivity.this(或 YourActivityName.this)解决了我的问题

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

确保您已经 Theme.AppCompat 并扩展了 AppCompatActivity。

您需要传递 Activity 的上下文,而不是传递您的上下文。尝试使用 "this" 而不是 "context"。这对我有用

问题是因为您正在传递构建警报的上下文 Dialog.Don不使用 getApplicationContext()。请尝试使用您的 Activity context.Use AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);

就我而言,我必须检查并确保所有 styles.xml 个文件都使用 Theme.AppCompat。标准 styles.xml 文件具有该主题,但也有 styles(v21).xml、styles(v11).xml 和 styles(sw600dp).xml 是自动的-生成。简单的解决方案是将自定义的默认 AppTheme 样式复制并粘贴到这些文件夹中。

祝一切顺利!

这对我有用...阅读几个答案后...

像这样更改我的导入:

import android.app.AlertDialog;

而不是

import android.support.v7.app.AlertDialog; 

这给出错误无法添加 window -- 令牌 null 不适用于应用程序...所以我将构建器的上下文从

更改为
AlertDialog.Builder builder = new 

AlertDialog.Builder(getAplicationContext()); 至

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

请注意此类问题,我已经为此类错误花费了很长时间。 它只发生在 android 4.4.2 版本上,尽管事实上我到处都在使用 Appcompat 主题,尝试使用所有样式并使用许多其他线程和答案。

问题是由这一行引起的:

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

请注意"parent.theme",我在启动我正在做的项目的第一天从一些答案中复制了它,它应该是"parent"没有主题。

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

像这样在清单中添加 Android:theme="@style/Theme.AppCompat"

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

解决了问题

如果您在创建对话框时遇到此错误(就我而言)您应该使用以下内容

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

而不是:

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

这对我来说非常有用!

如果您使用支持库,您的 activity 扩展 AppCompactActivity,如果您使用 android studio 创建 activity,这是默认设置。在这种情况下,将上下文作为 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>

当我如上所述使用 thisActivityName.this 时一切正常(这里 ActivityName 是您当前 activity 的名称,即 MainActivity.this)。

如果您在片段中使用,您应该将 getActivity() 作为上下文传递给构建器而不是 getContext()

在科特林中,这对我有用:

val dialog = AlertDialog.Builder(this)

只需将您的 activity 放在这里:

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

而不是

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