我想在我的应用中显示警告对话框。我正在使用片段。我尝试了以下代码来执行此操作:
AlertDialog ad = new AlertDialog.Builder(context)
.create();
ad.setCancelable(false);
ad.setTitle(title);
ad.setMessage(message);
ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
ad.show();
但它崩溃了,logcat中的错误是:
04-18 15:23:01.770:E / AndroidRuntime(9424):android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不适用于应用程序
从互联网上我开始知道崩溃是由于上下文问题。我给了上下文
context = this.getActivity().getApplicationContext();
我不知道这有什么问题。有谁能够帮我?
答案 0 :(得分:124)
将context
替换为getActivity()
。
ApplicationContext
不应用于创建对话框等任务。当您处于片段中时,您只需通过调用片段getActivity()
方法即可获得活动上下文。
答案 1 :(得分:12)
有关此问题的更多信息(片段中的AlertDialog,在事件中管理):
如果您在onClick(View v)或onLongClick(View v)等事件中调用AlertDialog,您可以使用
public boolean onClick(View v) {
...
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
...
}
答案 2 :(得分:9)
尝试使用DialogFragment,使用Fragments时,DialogFragment会更好
答案 3 :(得分:1)
我有类似的问题,我试图从Fragment创建一个AlertDialog。出现了NullPointerException。最初我做了如下:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
NullPointerException
特别是在代码中稍后调用alertDialog.show()
时发生的。
但在搜索AlertDialog.Builder()
的文档后,似乎有另一种方法来初始化它[AlertDialog.Builder Doc],其中包含一个主题/ resId,如下所示:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();
这解决了手头的NullPointerException
。希望这对你有帮助!
答案 4 :(得分:0)
我在listView中的适配器中使用它,因此我无法使用getActivity()
。为了使其工作,我使用getActivity()
作为片段中适配器实例化的上下文:
this.adapter = new myAdapter(getActivity(), factory);
后来在另一个类(适配器的类)中我能够使用getContext()
并且它有效。
答案 5 :(得分:0)
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
答案 6 :(得分:-1)
AlertDialog alert= null;
AlertDialog.Builder build= new AlertDialog.Builder(getActivity());
build.setTitle("title");
build.setItems(stringarrayname, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//Toast.makeText(getActivity(), "hi", Toast.LENGTH_SHORT).show();
}
});
build.create().show();
答案 7 :(得分:-1)
您可以尝试此操作或使用DialogFragment
private void showAlert(final int position) {
new AlertDialog.Builder(getActivity().getApplicationContext())
.setTitle("Delete entry")
.setMessage("Are you sure you want to delete this entry?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// deleteSuggestions(position);
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
答案 8 :(得分:-1)
解决方案是将其替换为getActivity()
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(),R.style.MaDialog);