首页 > 代码库 > 在fragment中显示对话框出现异常
在fragment中显示对话框出现异常
异常类型为:android.view.WindowManager$BadTokenException: Unable to add window
我在fragment中publicView onCreateView(LayoutInflaterinflater, ViewGroupcontainer,BundlesavedInstanceState) {中试图调用对话框静态工具类时出现该异常:当时上下文环境使用
context = getActivity().getApplicationContext();
调用方法为:
mp = new MyProgress(context); mp.start();
静态工具类为:
package com.srit.zcxc.myview; import android.app.AlertDialog; import android.content.Context; import android.graphics.Color; import android.view.Gravity; import android.view.View; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; public class MyProgress extends View { private AlertDialog.Builder builder = null; private AlertDialog dialog = null; private LinearLayout linear = null; public MyProgress(Context context) { super(context); builder = new AlertDialog.Builder(context); builder.setCancelable(false); linear = new LinearLayout(context); linear.setOrientation(LinearLayout.VERTICAL); linear.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); linear.setBackgroundColor(Color.BLACK); linear.setGravity(Gravity.CENTER); linear.setPadding(5, 5, 5, 5); ProgressBar pb = new ProgressBar(context); linear.addView(pb); TextView tv = new TextView(context); tv.setGravity(Gravity.CENTER); tv.setText("取消登录"); tv.setTextColor(Color.WHITE); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stop(); } }); linear.addView(tv); builder.setView(linear); } public void setBackgroundDrawableByresourceId(int resourceId) { linear.setBackgroundResource(resourceId); } public void start() { dialog = builder.show(); } public void stop() { if (dialog.isShowing()) { dialog.dismiss(); } } public boolean isShowing() { return dialog.isShowing(); } }
解决方法为:
mp = new MyProgress(this.getActivity()); mp.start();产生异常的原因:
获取上下文this.getApplicationContext())和 this的区别:
这里的this指的当然就是Acitivity.this , 指的是这个Acitivity的上下文,而this.getApplicationContext()指的则是整个应用
的上下文。
对于AlertDialog来说,是需要依赖一个View,而View是对应于Activity的。
那么为什么会报错呢,这里涉及到一个生命周期的问题了。
对于一个应用Context来说,它的生命周期是整个应用程序的生命周期,而对于Activity来说,当它销毁之后它的生命
周期就结束了。
AlertDialog是属于Acitivity的,当Activity销毁的时候它也必须销毁,所以这里我们指定是Activity的Context。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。