Dialog厅翔、AlertDialog如何實(shí)現(xiàn)全屏

1、全屏Dialog實(shí)現(xiàn)方式

public class FullScrreenDialog extends Dialog {
    public FullScrreenDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        <!--關(guān)鍵點(diǎn)1-->
        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        View view = LayoutInflater.from(getContext()).inflate(R.layout.fragment_full_screen, null);
        <!--關(guān)鍵點(diǎn)2-->
        setContentView(view);
        <!--關(guān)鍵點(diǎn)3-->
        getWindow().setBackgroundDrawable(new ColorDrawable(0x00000000));
        <!--關(guān)鍵點(diǎn)4-->
        getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    }
}
  • 1搀突、getWindow().requestFeature(Window.FEATURE_NO_TITLE);必須在setContent(View view)之后刀闷。
  • 2、關(guān)鍵點(diǎn)3和4必須通知設(shè)置才能達(dá)到全屏的效果仰迁。
    這又是為什么呢甸昏?這里先分析下關(guān)鍵點(diǎn)1。

1.1徐许、關(guān)鍵點(diǎn)1

先看下setContentView()

@Override
    public void setContentView(int layoutResID) {
        //...省略部分就是創(chuàng)建DecorView施蜜,把id為android.R.id.content的ContentParent添加到DecorView中。
        mContentParentExplicitlySet = true;
    }

在setContentView()方法的最后mContentParentExplicitlySet = true;雌隅,接下看下getWindow().requestFeature()

@Override
    public boolean requestFeature(int featureId) {
        if (mContentParentExplicitlySet) {
            throw new AndroidRuntimeException("requestFeature() must be called before adding content");
        }
        //省略代碼...
        return super.requestFeature(featureId);
    }

代碼很簡單翻默,mContentParentExplicitlySet為true時(shí),直接拋出異常恰起,所以
getWindow().requestFeature()必須在setContentView()之前調(diào)用修械,對(duì)于Activity也是一樣的。

1.2检盼、關(guān)鍵點(diǎn)3和關(guān)鍵點(diǎn)4

為什么getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);不能實(shí)現(xiàn)全屏呢肯污?
這是因?yàn)槿绻辉O(shè)置background的話就會(huì)使用默認(rèn)的背景,默認(rèn)背景是含有inset標(biāo)簽構(gòu)建的吨枉,并且四周設(shè)置了邊距蹦渣,所以不能達(dá)到全屏。
其實(shí)也可以在創(chuàng)建Dialog時(shí)东羹,傳入theme來實(shí)現(xiàn)全屏剂桥,只需設(shè)置windowIsFloating為false(Activity主題默認(rèn)就是false),并設(shè)置windowBackground即可属提。

<style name="BaseDialog" parent="Theme.AppCompat.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsFloating">false</item>
    </style>

1.3权逗、windowIsFloating的作用

具體原因可查看PhoneWindow中的generateLayout()方法

protected ViewGroup generateLayout(DecorView decor) {
      //....
        mIsFloating = a.getBoolean(R.styleable.Window_windowIsFloating, false);
        int flagsToUpdate = (FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR)
                & (~getForcedWindowFlags());
        if (mIsFloating) {
            setLayout(WRAP_CONTENT, WRAP_CONTENT);
            setFlags(0, flagsToUpdate);
        } else {
            setFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR, flagsToUpdate);
        }
}

當(dāng)mIsFloating為true時(shí)美尸,則調(diào)用setLayout(WRAP_CONTENT, WRAP_CONTENT),所以設(shè)置mIsFloating為false可實(shí)現(xiàn)全屏。
2斟薇、AlertDialog全屏實(shí)現(xiàn)方式
其實(shí)AlertDialog的全屏實(shí)現(xiàn)方式和Dialog基本是類似的师坎,不過需要注意的是getWindow.setLayout()需要在show()方法之后才生效。

AlertDialog alertDialog = new AlertDialog.Builder(this)
                .setView(R.layout.layout_dialog_small)
                .create();
        alertDialog.show();
        alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0xffffffff));
        alertDialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT);

看下AlertDialog的show()到底做了什么操作堪滨。

public AlertDialog show() {
            final AlertDialog dialog = create();
            dialog.show();
            return dialog;
        }

代碼很簡單就是創(chuàng)建AlertDialog并show()胯陋,主要的邏輯處理在show()中,AlertDialog.show()最終會(huì)調(diào)用Dialog中的show()

public void show() {
       //....
        if (!mCreated) {
            dispatchOnCreate(null);
        } else {
            // Fill the DecorView in on any configuration changes that
            // may have occured while it was removed from the WindowManager.
            final Configuration config = mContext.getResources().getConfiguration();
            mWindow.getDecorView().dispatchConfigurationChanged(config);
        }

        onStart();
        mDecor = mWindow.getDecorView();
      //.....
        mWindowManager.addView(mDecor, l);
   //....
        mShowing = true;

        sendShowMessage();
    }

由于首次創(chuàng)建所以mCreated=false袱箱,則調(diào)用Dialog的dispatchOnCreate()

void dispatchOnCreate(Bundle savedInstanceState) {
        if (!mCreated) {
            onCreate(savedInstanceState);
            mCreated = true;
        }
    }

onCreate(savedInstanceState)的真正實(shí)現(xiàn)在AlertDialog中的

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAlert.installContent();
    }

在onCreate中會(huì)調(diào)用AlertController的installContent()遏乔,最終會(huì)調(diào)用mWindow.setContentView(),在分析windowIsFloating時(shí),如果windowIsFloating=false发笔,則會(huì)調(diào)用setLayout(WRAP_CONTENT,WRAP_CONTENT)盟萨,所以如果在show之前調(diào)用setLayout設(shè)置寬高會(huì)被覆蓋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末了讨,一起剝皮案震驚了整個(gè)濱河市捻激,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌前计,老刑警劉巖胞谭,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異男杈,居然都是意外死亡丈屹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門势就,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泉瞻,“玉大人,你說我怎么就攤上這事苞冯。” “怎么了侧巨?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵舅锄,是天一觀的道長。 經(jīng)常有香客問我司忱,道長皇忿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任坦仍,我火速辦了婚禮鳍烁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘繁扎。我一直安慰自己幔荒,他們只是感情好糊闽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爹梁,像睡著了一般右犹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姚垃,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天念链,我揣著相機(jī)與錄音,去河邊找鬼积糯。 笑死掂墓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的看成。 我是一名探鬼主播梆暮,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绍昂!你這毒婦竟也來了啦粹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤窘游,失蹤者是張志新(化名)和其女友劉穎唠椭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍饰,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贪嫂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艾蓝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片力崇。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赢织,靈堂內(nèi)的尸體忽然破棺而出亮靴,到底是詐尸還是另有隱情,我是刑警寧澤于置,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布茧吊,位于F島的核電站,受9級(jí)特大地震影響八毯,放射性物質(zhì)發(fā)生泄漏搓侄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一话速、第九天 我趴在偏房一處隱蔽的房頂上張望讶踪。 院中可真熱鬧,春花似錦泊交、人聲如沸乳讥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雏婶。三九已至物赶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間留晚,已是汗流浹背酵紫。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留错维,地道東北人奖地。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像赋焕,于是被迫代替她去往敵國和親参歹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344