android 常见错误

问题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。

猜你喜欢

转载自862123204-qq-com.iteye.com/blog/2029227