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

时间:2015-05-12 01:03:20

标签: android appcompat-v7-r22.1

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

14 个答案:

答案 0 :(得分:99)

使用MainActivity.this(或YourActivityName.this)

修复了我的问题
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);

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

答案 1 :(得分:80)

基本上你的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));

答案 2 :(得分:48)

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

答案 3 :(得分:22)

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

答案 4 :(得分:8)

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

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

而不是:

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

这对我很有帮助!

答案 5 :(得分:4)

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

答案 6 :(得分:3)

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

像这样改变我的导入:

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

答案 7 :(得分:2)

添加Android:theme =&#34; @ style / Theme.AppCompat&#34;像清单中的这样

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

解决了问题

答案 8 :(得分: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时,一切正常。

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

答案 9 :(得分:0)

您需要传递Activity的上下文来传递Context。试试&#34;这个&#34;相反&#34; context&#34;。这项工作对我来说

答案 10 :(得分:0)

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

一切顺利!

答案 11 :(得分:0)

请注意这个问题,我已经长时间忍受这样的错误了。 它只发生在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/>

我只是想帮助那些从线程到线程运行的人找到解决他特定问题的方法,它可能与我的相同,节省您的时间。

答案 12 :(得分: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();

答案 13 :(得分:0)

在科特林,这对我有用:

val dialog = AlertDialog.Builder(this)