我在我的应用程序中使用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.(AppCompatDialog.java:47)
at android.support.v7.app.AlertDialog.(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并输入以下内容:
false
true
我的主题。 但是它会产生相同的错误。
Style.xml(旧)
@color/colorPrimary
@color/colorPrimaryDark
Style.xml(新)
false
true
@color/colorPrimary
@color/colorPrimaryDark
有人知道如何解决吗?
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我在哪里警报对话框的代码?
不要使用应用程序上下文来夸大视图,创建对话框。 new AlertDialog.Builder(this)也可以,因为它读取alertDialogTheme属性。
@Eugen Pechanec挽救了我的一天!
请访问此链接以解决问题:stackoverflow.com/a/45940291/4832664
通过使用MainActivity.this(或YourActivityName.this)解决了我的问题
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
确保您已经Theme.AppCompat和扩展AppCompatActivity。
这是对我有用的答案。太好了,谢谢!
这个问题有这么多复杂的答案,这是最好的答案。非常简单,无需更改任何xml文件。必须假定有这个问题的人已经有有效的xml文件。这只是扩展了现有代码的使用。
简单地使用getAplicationContext()将不起作用。您必须使用上面指定的格式。
@mariozawa您的回答对我有用。谢谢。 +1!
在kotlin中,使用this @ MainActivity创建对话框,如下所示:val alertDialog = AlertDialog.Builder(this @ MainActivity).create()
基本上,您的Activity使用的是工具栏(它代替了Action Bar),因此您需要为没有Action Bar的Activity使用样式,例如Theme.AppCompat.Light.NoActionBar。
如果您有自己的对话框样式,则需要继承适当的AppCompat主题。
true
...
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));
但是,如果我使用AlertDialog,则会出现错误java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
Theme.AppCompat.Dialog用于主题活动,Theme.AppCompat.Dialog.Alert用于主题警报对话框。前者导致在Lollipop之前的平台上的警报对话框可见的双窗口框架。
就我而言,我将父代替换为
只需将MainActivity.this传递给Builder即可正常工作。
这不适用于Fragment。错误:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
我收到此错误android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
@Martin使用ActivityName.this到Builder
就我而言,导致崩溃是因为我将View.getContext().getApplicationContext()作为Context传递给了Builder。这是通过使用getActivity()修复的。
使用Activity和Theme.Light主题看到了相同的异常。我的问题是导入错误,我正在使用支持项。 import android.support.v7.app.AlertDialog;代替
import android.app.AlertDialog;
宾果邦戈邦戈!这为我做到了。
这是我需要的解决方法。谢谢!!
如果在创建对话框时遇到此错误(就我而言),则应使用以下命令:
AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Light);
代替:
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
这对我来说很完美!
这对我有用,但我将R.style.Theme_AppCompat_Light更改为Theme_AppCompat_Light_Dialog,以便对话框不使用全屏显示。
在清单中添加这样的Android:theme =" @ style / Theme.AppCompat"
android:theme="@style/Theme.AppCompat"
android:name=".MainActivity"
解决了问题
这项工作对我来说...读了几个答案后...
像这样更改我的导入:
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*);
请多说明一点
我和他有同样的错误。我的应用仅在显示AlertDialog时崩溃。我误导入了AppCompat版本
该探查是由于要传递来构建警报对话框的上下文而引起的。不要使用getApplicationContext()。尝试使用您的Activity上下文。使用AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);
如果使用支持库,则活动扩展为AppCompactActivity,如果使用android studio创建活动,则这是默认设置。在这种情况下,将上下文作为ActivityName.this传递给构建器,或者简单地将this传递给构建器,如果您在onCreate中传递它,则无法传递getApplicationContext()。
这是我使用appcompact的样式
@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
18sp
false
true
当我如上所述使用this或ActivityName.this时,一切工作正常(此处ActivityName是您当前活动的名称,即MainActivity.this)。
如果在片段中使用,则应将getActivity()作为上下文传递给builder而不是getContext()。
紧凑风格:)
在科特林,这对我有用:
val dialog = AlertDialog.Builder(this)
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();
请谨慎对待此类问题,我已经长时间等待此类错误。
尽管我在各处都使用Appcompat主题,并尝试使用所有样式并使用许多其他线程和答案,但它仅在android 4.4.2版本上发生。
问题是由以下行引起的:
theme="@style/Theme.AppCompat.Light.NoActionBar">
请注意" parent.theme",我已经在启动我梦on以求的项目的第一天从一些答案中复制了它,它应该是没有主题的" parent"。
theme="@style/Theme.AppCompat.Light.NoActionBar">
我只想帮助其他在线程之间运行的人找出针对他非常具体的问题的解决方法,这可能与我的问题相同,从而节省了时间。
就我而言,我必须检查并确保所有styles.xml文件都使用Theme.AppCompat。标准的styles.xml文件具有该主题,但是还有自动生成的styles(v21).xml,styles(v11).xml和styles(sw600dp).xml。简单的解决方案是将自定义的默认AppTheme样式复制并粘贴到这些文件夹中。
祝一切顺利!
您需要传递活动的上下文,而不是传递上下文。尝试使用" this"而不是" context"。这对我有用