dialog横竖屏切换时消失的解决方法

时间:2023-02-12 00:20:48

声明

  本文原创,转载请注明来自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横竖屏切换时消失的解决方法的更多相关文章

  1. 横竖屏切换时&comma;Activity的生命周期

    横竖屏切换时,Activity的生命周期 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->onRe ...

  2. 横竖屏切换时Activity的生命周期

    设置横竖屏切换时Activity生命周期的属性设置,在清单文件中的Activity节点中设置.根据具体需求设置: 1.不设置Activity的android:configChanges时,切屏会重新调 ...

  3. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  4. 测试横竖屏切换时activity 的生命周期

    对于这个面试题,相信大家都见过,网上给出的答案是: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设 ...

  5. Android 如何去掉手机中横竖屏切换时的转屏动画?

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  6. Android(java)学习笔记224:横竖屏切换时Activity的生命周期

    1.横竖屏切换的生命周期     默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...

  7. Android(java)学习笔记167:横竖屏切换时Activity的生命周期

    1.横竖屏切换的生命周期     默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...

  8. 安卓横竖屏切换时activity的生命周期

    关于Activity横竖屏切换的声明周期变化: 1.新建一个Activity并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->on ...

  9. Andriod开发---《横竖屏切换时 Activity的生命周期的总结》

    横屏切换竖屏Activity的生命周期详解,下面分析一下切换时具体的生命周期: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--&g ...

随机推荐

  1. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  2. H3C IRF mad检测

    这里 irf 两个交换机 S4 S5 S4 S4的MEmber id 为1 IRF member 1 renumber 1 S4的 irf 优先为10 irf member priority 10 链 ...

  3. TinyFrame升级之十:WCF Rest Service注入IOC的心

    由于在实际开发中,Silverlight需要调用WebService完成数据的获取,由于之前我们一直采用古老的ASMX方式,生成的代理类不仅难以维护,而且自身没有提供APM模式的调用方式,导致在Sin ...

  4. CISA 信息系统审计知识点 &lbrack;第二章&period; IT治理和管理 &rsqb;

    第二章.  IT治理和管理 1.  IT治理.管理.安全和控制框架及标准.指南和实践 IT治理是董事会和执行管理层的职责. IT治理的关键因素:保持与业务的战略一致,引导业务价值的实现. IT治理关注 ...

  5. 前后端分离--mock

    fekit mock 数据 > fekit server -m mock.config 配置mock.config 支持正则 module.exports = { /queryProductDe ...

  6. vb&period;net 與 SQLite連線

    Dim ModuleSql As String Dim n As Integer 'SQLite連線Dim connSQLite As New Data.SQLite.SQLiteConnection ...

  7. Cygwin安装配置

    1.下载安装Cygwin   我们可以到Cygwin的官方网站下载Cygwin的安装程序,地址是: http://www.cygwin.com/ 或者直接使用下载连接来下载安装程序,下载连接是: ht ...

  8. iOS-多线程的底层实现

    (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开启多条线程,每条线程可以并行(同时 ...

  9. Git的安装和设置

    1.客户端下载 首先可以在https://git-scm.com/downloads下载客户端,进行安装. 2.安装 安装比较简单,可以直接默认一步一步往下安装即可: 3.配置github的ssh秘钥 ...

  10. SQL条件&excl;&equals;null查不出数据

    今天有一条sql需要某两个字段不能为空,当然是不能为null也不能为空字符串啦. 然后就开始写 WHERE ( order_amount != null and order_amount != '' ...