在fragment中显示对话框出现异常

异常类型为:android.view.WindowManager$BadTokenException:
Unable to add window

我在fragment中public
View onCreateView(LayoutInflater
inflater, ViewGroup
container,Bundle
savedInstanceState) {中试图调用对话框静态工具类时出现该异常:当时上下文环境使用

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。

时间: 2024-10-03 22:42:19

在fragment中显示对话框出现异常的相关文章

槽函数中显示对话框一闪而过

下面的代码是槽函数: @pyqtSignature("")def on_action_11_triggered(self):    # 帮助-关于    print "帮助-关于"    from Ui_about import Ui_Dialog_About    Dialog = QtGui.QDialog()    aboutDialog = Ui_Dialog_About()    aboutDialog.setupUi(Dialog)    Dialog.

在Activity的onCreate方法中显示PopupWindow导致异常的原因分析及解决方案

一.前言 在某些情况下,我们需要一进入Activity就显示PopupWindow,比如常见的选择界面.但由于PopupWindow是依附于Activity的,如果Activity没有创建完成,Activity还没完全显示出来就显示PopupWindow的话,会出现异常现象. 二.问题复现 我在Activity的onCreate()方法中调用如下方法: public void show( ){ if( null != mPopupWindow ){ mPopupWindow.showAtLoca

【Android笔记】Fragment中显示高德地图

本文来自:fair-jm.iteye.com 转截请注明出处 官网的教程是在Activity下 在Fragment下在高德论坛找到一些方法 试了下可以显示 但是切换后总会有些问题 比如切换后就是新的了 切换后地图就不显示了 我这种方式可以在切换后保持地图状态 但是得限定屏幕为水平或者竖直 如果翻转的话也会报错 布局文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns

Fragment中退出报错异常

开始吧,也没想过自己在用了Fragment之后,就习惯一直用了Fragment,不知道,其实我也觉得他也有很多弊端我没有解决,说实话...哎.... 以前一直会将状态存储下来.结果导致了重复生成.就是点击返回键,永远是返回到上一个页面.这样特别不科学.如果全是一级页面的话,就不妥了.所以,这里,我就索性不 要这一句了:fragmentTransaction.addToBackStack(null); 嘿嘿.. 然后还遇到在退出的时候Fragment MainActivity{41951c90}

在单文档中显示我的第一个对话框

在单文档中显示我的第一个对话框 (2010-04-19 21:19:50) 转载▼ 标签: it   今天编写了在单文档中创建对话框以及调用对话框的代码,收获很多: 1:OnInitDialog函数的加载问题尤其是在VS上的加载:(这一点花了很长时间才查到资料) OnInitDialog()函数是个virtual(虚函数),在它的类中用添加虚 函数的方法,会发现添加的虚函数里面没有这个函数,而这个 OnInitDialog函数是很有用的,在一般的添加进去的对话框的类中 是不会有这个函数的,必须手

C#.NET中使用BackgroundWorker在模态对话框中显示进度条

这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条. 首先是主窗体代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;

MFC对话框中显示背景图片

在MFC对话框中显示图片,四个步骤. 1.首先得在VC6.0或者VS2008(其他版本也是一样)中导入GDI文件.(网上下载:) GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. 分别将include文件夹和lib中的头文件全部添加到你的开发环境中的include或lib文件夹中.如:F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include. 将gdiplus.dll导入

fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .

fragment中嵌套viewpager,vierpager中有多个fragment,不显示 ... 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类似tab的选项. 底部用RadioGroup控制fragment的切换.以上有五个fragment. 第一个fragment,代表着首页.首页又是一个类似tab的fragment,使用viewpager切换着两个fragment. private void InitViewPager(View parentView) {        mP

在多线程中显示模态窗口,出现异常现象

无意间发现如果在多线程中显示模态窗口后,当这个模态窗口关闭后,原来的主窗口无法再次响应鼠标事件了. 就是窗口上的按钮用鼠标点击没反应,整个窗口看上去像是禁用的状态. 具体原因到现在没找到. 最后的解决办法: 在多线程中,使用 SendMessage() 发送一个[用户自定义消息], 然后由UI线程来接收,并显示模态窗口,这个时候当模态窗口关闭后,主窗口还是处于激活的状态,窗口上的按钮可以正常点击和响应. 同时我发现,如果在多线程中,调用 MessageBox() 来弹出模态对话框,当关闭对话框后