dialog横竖屏切换时消失的解决方法
声明
本文原创,转载请注明来自xiaoQLu http://www.cnblogs.com/xiaoQLu/p/3324764.html
dialog的生命周期依赖创建他的activity,怎么设置横竖屏切换时,dialog不重新创建,可以参考我的上一遍博客 http://www.cnblogs.com/xiaoQLu/p/3324503.html 。
按照上面的方法设置configChanges,是可以解决dialog消失的问题,但是会出现另一个问题,就是在android4.0的机器上,横屏变成竖屏后,dialog的宽度不变,这样子,就很难看,我们想要的是让他重新布局,随着屏幕变宽一点。
该怎么实现呢?
这里有一个比较巧妙的方法,
1、根据你的需要写一个根view的onLayout方法,如下,并写一个回调接口供dialog实现,我这里直接把dialog传进来了。
public class MiddleView extends RelativeLayout {
	private CreditsWallDialog mDialog;
	public MiddleView(Context context, CreditsWallDialog dialog) {
		super(context);
		this.mDialog = dialog;
	}
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		super.onLayout(changed, left, top, right, bottom);
		mDialog.onLayoutCallBack(left, top, right, bottom);
	}
}
2、dialog的layout中把MiddleView作为根视图使用,如果是代码布局的话可以这样 setContentView(new MiddleView(mContext, this));
<?xml version="1.0" encoding="utf-8"?>
<cn.richinfo.jifenqiang.widget.MiddleView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <!-- 这里添加自己的控件 --> </cn.richinfo.jifenqiang.widget.MiddleView>
3、在dialog中实现步骤1中的回调方法
    public void onLayoutCallBack(int left, int top, int right, int bottom) {
        DisplayWindow win = DisplayWindow.getDisplayWindow(mContext);
        int width = (int) ((double) win.width * scale_width);
        int height = (int) ((double) win.height * scale_height);
        if (width == this.mWidth && height == this.mHeight) {
            LogUtils.println("lcq:onLayCallbck is same to last...");
            return;
        }
        setWindowAttribute(width, height);
    }
4、重新设置windows的宽度和高度
private void setWindowAttribute(int width, int height) {
        Window window = getWindow();
        android.view.WindowManager.LayoutParams windowParams = window
                .getAttributes();
        windowParams.width = width;
        windowParams.height = height;
        DisplayWindow dWin = DisplayWindow.getDisplayWindow(mContext);
        int adjustPix = dWin.dipToPix(16);
        windowParams.width += adjustPix;
        windowParams.height += adjustPix;
        if (windowParams.width > dWin.width) {
            windowParams.width = dWin.width;
        }
        if (windowParams.height > dWin.height) {
            windowParams.height = dWin.height;
        }
        this.mWidth = width;
        this.mHeight = height;
        window.setAttributes(windowParams);
    }
5、在dialog的构造函数中调用一次 setWindowAttribute 方法,这个主要是保证切初始时的窗口和 横屏切回到竖屏时的窗口大小一致
这里主要是讲一种思路,仔细看下,就大概知道思路了,主要是通过横竖屏切换时,view的onLayout会被重新调用来实现的,中间加上对窗口的宽度和高度的计算,由于onLyaout会被调用多次,所以有些重复的调用可以用return返回掉。
dialog横竖屏切换时消失的解决方法的更多相关文章
- 横竖屏切换时,Activity的生命周期
		
横竖屏切换时,Activity的生命周期 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->onRe ...
 - 横竖屏切换时Activity的生命周期
		
设置横竖屏切换时Activity生命周期的属性设置,在清单文件中的Activity节点中设置.根据具体需求设置: 1.不设置Activity的android:configChanges时,切屏会重新调 ...
 - Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
		
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
 - 测试横竖屏切换时activity 的生命周期
		
对于这个面试题,相信大家都见过,网上给出的答案是: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设 ...
 - Android 如何去掉手机中横竖屏切换时的转屏动画?
		
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
 - Android(java)学习笔记224:横竖屏切换时Activity的生命周期
		
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
 - Android(java)学习笔记167:横竖屏切换时Activity的生命周期
		
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
 - 安卓横竖屏切换时activity的生命周期
		
关于Activity横竖屏切换的声明周期变化: 1.新建一个Activity并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->on ...
 - Andriod开发---《横竖屏切换时 Activity的生命周期的总结》
		
横屏切换竖屏Activity的生命周期详解,下面分析一下切换时具体的生命周期: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--&g ...
 
随机推荐
- Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
			
Xamarin.Forms 是一个跨平台的.基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面.Xamarin.Forms 通过 ...
 - Qt 二级菜单栏 中文无法输入问题
			
问题描述:Qt5.3.1版本在建立主界面的二级菜单的时候,中文无法输入,而英文确是可以输入的.(首先我在网页上面搜索了一下,他们说是Qt的设计问题.) 解决方法: (1)粘贴复制,把中文写在其他的地方 ...
 - C语言实现二叉树-01版
			
故事是这样开始的,项目经理有一天终于还是拍拍我肩膀说: 无论你的链表写得多么的好,无论是多么的灵活,我也得费老半天才查找到想要的数据: 这让我的工作非常苦恼,听说有一种叫做二叉树的数据结构,你看能不能 ...
 - 菜鸟日记-HTML-表格与表单
			
一.表格 <table></table> width:宽度.可以用像素或百分比表示. border:边框,常用值0 cellpadding:内容跟单元格边框的边距.常用值0 a ...
 - ps、grep和kill联合使用杀掉进程
			
例如要杀掉hello这个进程,使用下面这个命令就能直接实现. ps -ef |grep hello |awk '{print $2}'|xargs kill -9 这里是输出ps -ef |gre ...
 - 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法 ——转载
			
一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误
 - WindowsPhone8拍照功能实现简介
			
WindowsPhone作为一款智能手机操作系统,支持APP中拍照是必不可少的,目前在WP8上的拍照主要有以下三种途径: 1.使用CameraCaptureTask: 2.使用PhotoCamera类 ...
 - 详解Bootstrap网格系统
			
bootstrap框架中的网格系统就是将容器平分成12份,在使用的时候可以根据实际情况重新编译LESS/SASS源码来修改12这个数值.bootstrap框架的网格系统工作原理: 1.数据行(.row ...
 - 17数据表&E-R模型&概念数据模型上-选学天轰穿大话数据库视频教程
			
大纲:解剖“数据表”,戏说E-R模型,概念数据模型(E-R 到 CDM),使用PowerDesigner创建概念模型,生成逻辑数据模型 土豆超清地址: 腾讯超清地址: 百度云盘下载地址:上传ing,稍 ...
 - HBase + Kerberos 配置示例(一)
			
用过hbase的朋友可能都有过这样的疑问,我写一个java client,好像就提供了zookeeper quorum地址就连上hbase了,那么是不是存在安全问题?的确是,如何解决?hbase中引入 ...