问题1:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
修改一个需求的时候出现这个问题:需求需要在PreferenceScreen 里面弹出一个窗口,我写的时候发现一个问题
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity().getApplicationContext()); builder.setTitle("data romaing"); //builder.setView(new ListView(getActivity())); builder.setMessage("choose"); builder.setPositiveButton("yes", new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.setNegativeButton("no", new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); AlertDialog dialog = builder.create(); dialog.show();
错误的原因:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity().getApplicationContext());
应该改成:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
this.getApplicationContext()); 和 this的区别:
这里的this指的当然就是Acitivity.this , 指的是这个Acitivity的上下文,而this.getApplicationContext()指的则是整个应用的上下文。
对于AlertDialog来说,是需要依赖一个View,而View是对应于Activity的。
那么为什么会报错呢,这里涉及到一个生命周期的问题了。
对于一个应用Context来说,它的生命周期是整个应用程序的生命周期,而对于Activity来说,当它销毁之后它的生命周期就结束了。
AlertDialog是属于Acitivity的,当Activity销毁的时候它也必须销毁,所以这里我们指定是Activity的Context。