安卓popwindow进入页面自动开启问题
2016-07-19 10:47
399 查看
Android中在onCreate()时弹出popwindo,但是直接在onCreate()中调用popwindow的showAtLocation()方法是会报异常的,原因是此时activity还没有初始化完毕。其实可以通过不断的检测当前activity的状态,一旦初始化完毕立即调用popwindow的showAtLocation()方法显示。详细代码如下:
[java] view
plain copy
/************************************************************************
*
* 该类用来在初始化的时候弹出一个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>
*
************************************************************************/
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是否初始化完毕*************/
}
}
[java] view
plain copy
/************************************************************************
*
* 该类用来在初始化的时候弹出一个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>
*
************************************************************************/
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是否初始化完毕*************/
}
}
相关文章推荐
- CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放
- CentOS 7 使用阿里云的yum源
- hadoop机架感知
- Linux ext2/ext3文件系统
- 谁说linux下无游戏,十大免费linux大型游戏集合
- linux下面一个简单ps的实现
- Linux GCC编译库
- openwrt 编译烧写流程
- Hadoop Yarn 框架原理及运作机制
- linux环境下kettle部署(JDK安装配置,kettle安装配置,资源库配置,定时执行job)
- Linux命令之chmod详解
- shell 脚本学习之 在mac下怎么执行shell脚本
- 搭建OpenWrt开发环境(包括编译过程)
- linux笔记:linux常用命令-文件搜索命令
- CentOS6.5安装python环境
- AOP经典2种配置示例
- Docker化运维方式讲解
- 毕业生网站:重点
- OpenCV学习笔记(四):ROI区域图像叠加和图像线性混合
- CentOS6.5文件同步分发脚本