不久前,用AlertDialog控件实现一些功能时,遇到了WindowManager$BadTokenException的错误,查了一些资料终于解决了这问题,与大家共享下我的理解.我编写了一个测试代码,不多说代码如下:
布局文件很简单就一个button,就不给布局代码了。主代码如下:
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
Button alert_Button;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
alert_Button = (Button) findViewById(R.id.button1);
alert_Button.setOnClickListener(this);
mContext = getApplicationContext();
}
@Override
public void onClick(View arg0) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setIcon(R.drawable.ic_launcher).setTitle("测试...")
.setMessage("测试提示框的实现");
builder.setPositiveButton("yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
}).setNegativeButton("no", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
});
builder.create().show();
}
}
其实这个错误很简单,就是我在实例化AlertDialog.Builder时,用了mContext.而mContext=getApplicationContext.
getApplicationContext返回的是应用的上下文对象.而不是Activity对象。因此只要改成this即可。
getApplicationContext方法生命周期是整个应用,与应用共生共死。