关于Dialog使用上下文的问题

来源:互联网 发布:陪我聊天软件 编辑:程序博客网 时间:2024/04/30 13:57
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);}@Overrideprotected 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);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint p = new Paint();p.setColor(Color.GREEN);canvas.drawCircle(200, 200, 200, p);}@Overridepublic 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上了。



如有错误,请各位指正





0 0
原创粉丝点击