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

Ram*_*ara 59 android android-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)
Run Code Online (Sandbox Code Playgroud)

基于该错误,我将我的主题更改为Theme.AppCompat:

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
Run Code Online (Sandbox Code Playgroud)

我的主题.但它会产生同样的错误.

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何解决它?

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();
}
}
Run Code Online (Sandbox Code Playgroud)

mar*_*awa 101

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

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
Run Code Online (Sandbox Code Playgroud)

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

  • 这个问题有很多复杂的答案,这是最好的答案.非常简单,没有要更改的xml文件.必须假定有这个问题的人已经有了工作的xml文件.这只是扩展了现有代码的使用范围. (7认同)
  • 简单地使用`getAplicationContext()`将不起作用.您必须使用上面指定的格式. (3认同)
  • 这个答案对我有用.太棒了,谢谢! (2认同)

inm*_*yth 81

基本上你的Activity正在使用Toolbar(它取代了Action Bar),所以你需要为没有Action Bar的Activity使用样式Theme.AppCompat.Light.NoActionBar.如果你有自己的对话风格,那么你需要继承适当的AppCompat主题.

<style name="myDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    ...
</style>
Run Code Online (Sandbox Code Playgroud)

AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));
Run Code Online (Sandbox Code Playgroud)

  • 只需将"MainActivity.this"传递给Builder即可. (14认同)
  • `Theme.AppCompat.Dialog`用于主题活动,`Theme.AppCompat.Dialog.Alert`用于主题警告对话框.前者导致在Lollipop之前的平台上的警报对话框可见双窗口框架. (3认同)

Bin*_*abu 50

在我的情况,因为我经过这个撞车事故中造成View.getContext().getApplicationContext()ContextBuilder.这是通过使用getActivity()而修复的.


小智 22

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


Kar*_*oly 9

如果您在创建对话框时遇到此错误(仅在我的情况下),您应该使用以下内容:

AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Light);
Run Code Online (Sandbox Code Playgroud)

代替:

AlertDialog.Builder dialog = new AlertDialog.Builder(context);
Run Code Online (Sandbox Code Playgroud)

这对我很有帮助!


Raj*_*h.k 5

问题是因为您传递的上下文来构建警报对话框。不要使用 getApplicationContext()。尝试使用您的活动上下文。使用 AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);


小智 5

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

像这样更改我的导入:

import android.app.AlertDialog;
Run Code Online (Sandbox Code Playgroud)

代替

import android.support.v7.app.AlertDialog; 
Run Code Online (Sandbox Code Playgroud)

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

AlertDialog.Builder builder = new 
Run Code Online (Sandbox Code Playgroud)

AlertDialog.Builder(getAplicationContext()); 到

AlertDialog.Builder builder = new AlertDialog.Builder(*MainActivity.this*);
Run Code Online (Sandbox Code Playgroud)