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

我在 App 中使用 appcompat v22.1.0,并使用 Toolbar。当我使用 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>

我的主题。但它产生了同样的错误。

Xml (旧版)

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

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();
}
}
106473 次浏览

基本上,您的活动是使用工具栏(它取代了动作栏) ,所以您需要使用的活动,没有像 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。

您需要传递活动的上下文来代替传递上下文。试着用“这个”代替“上下文”。这对我有用

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

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

一切顺利!

这份工作对我来说... 读了几遍回答是..。

像这样改变我的重要性:

import android.app.AlertDialog;

而不是

import android.support.v7.app.AlertDialog;

无法添加窗口——令牌 null 不适用于应用程序... 所以我将构建器的上下文从

AlertDialog.Builder builder = new

生成器(getApplicationContext ()) ; 到

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”,我是在启动项目的头几天从某个答案中复制过来的,它应该是没有主题的“ rent”。

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

这招对我很管用!

如果您正在使用支持库,您的活动扩展 AppCompactActivity,如果您使用 android studio来创建活动,这是默认的。在这种情况下,将上下文作为 ActivityName.this传递给构建器,或者如果在 onCreate中传递 this,则传递 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()作为上下文传递给构建器,而不是 getContext()

在科特林,这对我很有效:

val dialog = AlertDialog.Builder(this)

把你的活动写在这里:

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

而不是

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