Android橫豎屏切換及其對應(yīng)布局加載問題詳解
本文為大家分享了Android橫豎屏切換及其對應(yīng)布局加載問題,供大家參考,具體內(nèi)容如下
第一,橫豎屏切換連帶橫豎屏布局問題:
如果要讓軟件在橫豎屏之間切換,由于橫豎屏的高寬會發(fā)生轉(zhuǎn)換,有可能會要求不同的布局。
可以通過以下兩種方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應(yīng)的layout文件名不變,比如:layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時(shí)程序調(diào)用Activity的onCreate方法中的setOnContent(xxx),并自動加載相應(yīng)的布局。
2)假如布局資源不按照如上設(shè)置,則可以通過java代碼來判斷當(dāng)前是橫屏還是豎屏然后來加載相應(yīng)的xml布局文件。因?yàn)楫?dāng)屏幕變?yōu)闄M屏的時(shí)候,系統(tǒng)會重新加載當(dāng)前Activity的onCreate方法(也就是說:該Activity的生命周期要重頭開始),你可以把以下方法放在你的onCreate中來檢查當(dāng)前的方向,然后可以讓你的setContentView來載入不同的layout 。
/** 1:豎屏 2:橫屏 判斷屏幕以旋轉(zhuǎn)的方向 */ private int orientation; orientation=getResources().getConfiguration().orientation;
第二,強(qiáng)制設(shè)定屏幕的橫、豎屏方向:
Android橫豎屏切換在手機(jī)開發(fā)中比較常見,很多軟件在開發(fā)過程中為了避免橫豎屏切換時(shí)引發(fā)不必要的麻煩,通常要強(qiáng)制設(shè)置橫豎屏的方向,通過在AndroidManifest.xml中設(shè)置activity中的android:screenOrientation屬性值來實(shí)現(xiàn)。
比如下列設(shè)置:
橫屏顯示設(shè)置:android:screenOrientation="lanscape"
豎屏顯示設(shè)置:android:screenOrientation="portrait"
當(dāng)然上述修改也可以在Java代碼中通過代碼來實(shí)現(xiàn):(android屏幕的切換會重啟Activity,所以在Activity銷毀前保存當(dāng)前活動的狀態(tài),并在Activity再次Create的時(shí)候載入配置)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
第三,攔截橫豎屏切換 需要的配置文件:onConfigurationChanged
Activity每次橫豎屏切換都會重新調(diào)用onPause->onStop-> onDestory->onCreate->onStart->onResume(為此內(nèi)容和數(shù)據(jù)要保存和讀取,否則轉(zhuǎn)屏之前的內(nèi)容就會消失了)
很多時(shí)候這樣的結(jié)果讓程序繁瑣,為此Android提供了在manifest中設(shè)置android:configChanges屬性,從而讓Activity不延續(xù)上述的重建流程;
方式一)在Android工程的Mainfest.xml中配置Activity:android:configChanges="keyboardHidden|orientation ,橫豎屏切換之后就不會去執(zhí)行OnCreat函數(shù)了,而是會去調(diào)用onConfigurationChanged()這樣就能控制橫豎屏的切換了。
方式二)用戶可以在Activity或View的:onConfigurationChanged(Configurationnew Config) ,函數(shù)中獲取當(dāng)前橫豎屏參數(shù)。至于其調(diào)用順序跟touch時(shí)間的傳遞順序相似,不過他沒有消費(fèi)事件的概念,會順次調(diào)用到每一個(gè)onConfigurationChanged函數(shù)。
需要重寫Activity的onConfigurationChanged方法。實(shí)現(xiàn)方式如下,不需要做太多的內(nèi)容:
需要注意的是,onConfigurationChanged函數(shù)中只能獲得橫豎屏切換后的參數(shù),在該函數(shù)中獲取不到新的Layout和控件的尺寸位置信息,如果要處理尺寸和位置信息,必須通過消息異步或者延時(shí)調(diào)用;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
} else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
第四,自適應(yīng)切換屏幕:
如果想讓它啟動的時(shí)候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然后手機(jī)切換橫豎屏就不能用了該怎么解決呢?
首先:在Mainfest.xml中追加android:screenOrientation="sensor" android:configChanges="orientation|keyboardHidden"
然后:取得屏幕的長和寬,進(jìn)行比較設(shè)置橫豎屏的變量。
Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); if (width > height) { orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; // 橫屏 } else { orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // 豎屏 }
然后:在onConfigurationChanged()函數(shù)中追加this.setRequestedOrientation(orientation)
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); this.setRequestedOrientation(orientation); }
但是這樣的話你切到別的畫面的時(shí)候再回到原畫面,它就仍然是橫的或者是縱的。怎么讓它從別的屏幕回來后,又重新橫豎屏布局呢?
只要在OnResume()中在設(shè)定下就行了,但是這個(gè)僅僅只是支持橫豎屏只有一個(gè)layout的;
protected void onResume() { orientation = ActivityInfo.SCREEN_ORIENTATION_USER; this.setRequestedOrientation(orientation); Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); if (width > height) { orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } else { orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; } super.onResume(); }
有三點(diǎn)請注意:
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會重新調(diào)用各個(gè)生命周期,只會執(zhí)行onConfigurationChanged方法
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android studio集成unity導(dǎo)出工程的實(shí)現(xiàn)
本文主要介紹了android studio集成unity導(dǎo)出工程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Android開源AndroidSideMenu實(shí)現(xiàn)抽屜和側(cè)滑菜單
這篇文章主要為大家詳細(xì)介紹了Android開源AndroidSideMenu實(shí)現(xiàn)抽屜和側(cè)滑菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android開發(fā)服務(wù)Service全面講解
Android的服務(wù)是開發(fā)Android應(yīng)用程序的重要組成部分。不同于活動Activity,服務(wù)是在后臺運(yùn)行,服務(wù)沒有接口,生命周期也與活動Activity非常不同。通過使用服務(wù)我們可以實(shí)現(xiàn)一些后臺操作,比如想從遠(yuǎn)程服務(wù)器加載一個(gè)網(wǎng)頁等,下面來看看詳細(xì)內(nèi)容,需要的朋友可以參考下2023-02-02Android利用RenderScript實(shí)現(xiàn)毛玻璃模糊效果示例
毛玻璃效果(亦稱磨砂效果),近兩年在移動端的UI設(shè)計(jì)上越來越流行,下面這篇文章主要介紹了Android利用RenderScript實(shí)現(xiàn)毛玻璃模糊效果的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。2017-03-03android 實(shí)現(xiàn)側(cè)邊彈窗特效代碼
側(cè)邊彈窗是在左邊,需要定位好位置,實(shí)現(xiàn)原理其實(shí)就是進(jìn)出動效,用位移加透明度效果來控制,下面通過代碼給大家介紹android 實(shí)現(xiàn)側(cè)邊彈窗,需要的朋友參考下吧2021-06-06Android ViewPager無限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動態(tài)滑動
這篇文章主要為大家詳細(xì)介紹了Android ViewPager無限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動態(tài)滑動的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03Android自定義View實(shí)現(xiàn)QQ消息氣泡
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)QQ消息氣泡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08