dialog橫豎屏切換時消失的解決方法

muzhi121發表於2013-09-16

宣告

  本文原創,轉載請註明來自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返回掉。

 

相關文章