Android在初始化时弹出popwindow的方法

Android中在onCreate()时弹出popwindow,很多人都有过类似的需求吧,但是直接在onCreate()中调用popwindow的showAtLocation()方法是会报异常的,原因是此时activity还没有初始化完毕,网上也有一些解决方法,但一般都是通过延时一小段时间再弹出实现的,代码不够健壮。其实可以通过不断的检测当前activity的状态,一旦初始化完毕立即调用popwindow的showAtLocation()方法显示。详细代码如下:

/************************************************************************
 *
 * 该类用来在初始化的时候弹出一个popwindow,用到的而已文件如下,特别要注意的是其中的 
 * android:minHeight="1dp" 和android:minWidth="1dp"属性。初始化时弹出popwindow的关键是
 * 要等待整个activity初始化完毕后再调用showAtLocation()方法,否则会出异常。
 * 实现方式就是不停的检测acitvity是否初始化完毕,一旦完毕就调用
 * showAtLocation() 方法显示popwindow。
 *
 * 以下为布局文件:
 *	<?xml version="1.0" encoding="utf-8"?>
 *	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 *	    android:id="@+id/main"
 *	    android:layout_width="fill_parent"
 *	    android:layout_height="fill_parent"
 *	    android:minHeight="1dp"
 *	    android:minWidth="1dp"
 *	    android:orientation="vertical" >
 *	</LinearLayout>
 *
 * 作者:石兴
 * 完成时间:2012/3/10
 * 版本 :1.0
 *
 ************************************************************************/

package cn.sd.sx.initpopw;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import cn.sd.sx.popw.R;

public class PopWActivity extends Activity {
	
	private PopupWindow mPopupWindow;
	private Handler mHandler;
	// 检测时间间隔
	private int detchTime = 5;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mHandler = new Handler();
        // 显示popWindow
        showPopWindow();
    }

	private void showPopWindow()
    {
    	LinearLayout view = new LinearLayout(this);
    	LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,
    			LayoutParams.FILL_PARENT);
    	TextView txt1 = new TextView(this);
    	txt1.setLayoutParams(params);
    	txt1.setGravity(Gravity.CENTER);
    	txt1.setText("txt1");
    	txt1.setBackgroundColor(Color.RED);
    	view.addView(txt1);
    	mPopupWindow = new PopupWindow(view, 300,300);
    	mPopupWindow.setOutsideTouchable(true);
    	
    	/*****************以下代码用来循环检测activity是否初始化完毕***************/
    	Runnable showPopWindowRunnable = new Runnable() {
			
			@Override
			public void run() {
				// 得到activity中的根元素
				View view = findViewById(R.id.main);
				// 如何根元素的width和height大于0说明activity已经初始化完毕
				if( view != null && view.getWidth() > 0 && view.getHeight() > 0) {
					// 显示popwindow
			    	mPopupWindow.showAtLocation(PopWActivity.this.findViewById(R.id.main),
			    			Gravity.CENTER, 0, 0);
			    	// 停止检测
					mHandler.removeCallbacks(this);
				} else {
					// 如果activity没有初始化完毕则等待5毫秒再次检测
					mHandler.postDelayed(this, detchTime);
				}
			}
		};
		// 开始检测
		mHandler.post(showPopWindowRunnable);
	  /******************以上代码用来循环检测activity是否初始化完毕*************/
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值