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


74

我在我的应用程序中使用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();
}
}

When I start implement AlertDialog我在哪里警报对话框的代码?
Rod_Algonquin

34
不要使用应用程序上下文来夸大视图,创建对话框。new AlertDialog.Builder(this)也会很好,因为它读取alertDialogTheme属性。
Eugen Pechanec 2015年

@Eugen Pechanec挽救了我的一天!
Biswas Khayargoli

请访问此处以解决问题的链接:stackoverflow.com/a/45940291/4832664
是,是的

Answers:


87

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

1
但是,如果我使用AlertDialog,它会给我带来错误java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
Rama Bramantara 2015年

3
Theme.AppCompat.Dialog用于主题活动,Theme.AppCompat.Dialog.Alert用于主题警报对话框。前者导致在Lollipop之前的平台上的警报对话框可见的双窗口框架。
Eugen Pechanec,2015年

就我而言,我将父母替换为<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
shareef 2015年

19
只需将传递MainActivity.this给Builder就可以了。
猛禽

这在Fragment中不起作用。错误:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
Konstantin Konopko '16

112

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

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

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


2
这是对我有用的答案。太好了,谢谢!
加雷斯

7
这个问题有这么多复杂的答案,这是最好的答案。非常简单,无需更改任何xml文件。必须假定有这个问题的人已经有有效的xml文件。这只是扩展了现有代码的使用。
戴尔

3
简单地使用是getAplicationContext()行不通的。您必须使用上面指定的格式。
mjr

@mariozawa您的回答对我有用。谢谢。+1!
IRGeekSauce

在kotlin中,使用this @ MainActivity创建对话框,如下所示:val alertDialog = AlertDialog.Builder(this @ MainActivity).create()
Joe Pinsonault,

55

在我的情况,因为我经过这个撞车事故中造成View.getContext().getApplicationContext()ContextBuilder。此问题已通过使用getActivity()来解决。


23

使用ActivityTheme.Light主题看到了相同的异常。我的问题是导入错误,我正在使用支持项。import android.support.v7.app.AlertDialog;代替 import android.app.AlertDialog;


宾果邦戈邦戈!这为我做到了。
james

这是我需要的解决方法。谢谢!!
辛迪

12

如果创建对话框时出现此错误(就我而言),则应使用以下命令

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

代替:

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

这对我来说很完美!


1
这对我有用,但是我更改R.style.Theme_AppCompat_LightTheme_AppCompat_Light_Dialog使对话框不使用全屏显示。
艾伦·金纳曼

5

该探查是由于要传递来构建警报对话框的上下文而引起的。不要使用getApplicationContext()。尝试使用您的Activity上下文。 AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);


5

这项工作对我来说...读完几个答案后...

像这样更改我的导入:

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

1
请多解释一下
穆罕默德·穆阿查姆

我和他有同样的错误。我的应用仅在显示AlertDialog时崩溃。我错误地导入了AppCompat版本
mjekov

4

在清单中添加这样的Android:theme =“ @ style / Theme.AppCompat”

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

解决了问题


1

在科特林,这对我有用:

val dialog = AlertDialog.Builder(this)

1

如果使用支持库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>

当我使用thisActivityName.this如上所述时,一切都工作正常(此处ActivityName是您当前活动的名称,即MainActivity.this)。

如果您在片段中使用,则应将getActivity()上下文传递给builder而不是getContext()


appcompact风格:)
AlexS

0

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


0

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

祝一切顺利!


0

请谨慎对待此类问题,我已经长时间等待此类错误。尽管我在各处都使用Appcompat主题,并尝试使用所有样式并使用许多其他线程和答案,但它仅在android 4.4.2版本上发生。

问题是由以下行引起的:

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

请注意“ parent.theme”,我已经在启动我梦w以求的项目的第一天从一些答案中复制了它,它应该是没有主题的“ parent”。

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

我只想帮助其他在线程间运行的人找出针对他的特定问题的解决方法,这可能与我的问题相同,从而节省了时间。


0
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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.