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 ...
随机推荐
- tomcat安全配置
1. 注释或删除 tomcat-users.xml 所有用户权限,看上去如下: <tomcat-users></tomcat-users> 2. 隐藏tomcat版本信息 1 ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
- 第八章xml学习
1.ASP.NET和JSP的关系 ASP.NET 和JSP都是用来开发动态网站的技术,只不过ASP.NET是通过c#语言来操作的, 而JSP是通过Java语言来操作的. 2.为什么学习XML? 01. ...
- 插件~NuGet与packages管理项目的包包
NuGet NuGet是一个工具,已经被集成到VS开发环境里,直接使用它可以快速安装第三方的包包,包包就是一组DLL和资源,开发者把它们打包一个包包,或者叫做package,而我们使用nuget可以将 ...
- linux下ssh远程登录服务器入门操作
使用用户名密码登录 在命令行中输入命令: ssh username@ip_address -p port 之后系统会提示输入密码,输入后即可登录 如果不添加-p选项,则默认是22端口 还可以使用-l选 ...
- Atitit.实现继承的原理and方法java javascript .net c# php ...
Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 ...
- paip.简化字-手写参考二简字..共98个
paip.简化字-手写参考二简字..共98个 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/a ...
- PHP基础(一)
<?php $expression = false; if($expression == true): ?> <p>This will show if the expressi ...
- 阿里云的NoSQL存储服务OTS的应用分析
这篇文章主要介绍了阿里云的NoSQL存储服务OTS的应用分析,OTS作为阿里巴巴开发的NoSQL存储技术服务现已面向用户商业化,需要的朋友可以参考下. 1. 概要 OTS是构建在阿里云飞天分布式系统 ...
- Windows下安装 msysGit 以及初始化 Git server环境
Windows下git工具msysGit使用以及Git server初始化 Windows下git工具,这里选择msysGit,版本为msysGit-netinstall-1.8.1.2-previe ...