public class DActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);<pre name="code" class="java">public class MyDialog extends Dialog {
public MyDialog(Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setTitle("123");
setContentView(R.layout.a);
super.onCreate(savedInstanceState);
}
}
setContentView(new MyView(getApplicationContext()));
} }
public class MyView extends View{
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
p.setColor(Color.GREEN);
canvas.drawCircle(200, 200, 200, p);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() != event.ACTION_DOWN)
return super.onTouchEvent(event);
MyDialog md = new MyDialog(this.getContext());
md.show();
return true;
}
}
因为一般来说,Dialog是依存于Activity的,所以在setContentView(new MyView(getApplicationContext()));中,传给MyView的是整个程序的上下文对象,导致MyDialog md = new MyDialog(this.getContext());中this.getContext()得到的也是整个程序的上下文对象。所以在dialog.show()时,会弹出ndroid.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application异常。为此要将DActivity中的setContentView(new MyView(getApplicationContext()));改为setContentView(new MyView(DActivity.this));也就是把DActivity当做MyView的上下文传进去,这样就可以使MyDialog也是运行在DActivity上了。
如有错误,请各位指正