android 判斷橫豎屏問題的詳解
Android橫豎屏要解決的問題應(yīng)該就兩個(gè):一。布局問題;二。重新載入問題。
1.布局問題:如果不想讓軟件在橫豎屏之間切換,最簡單的辦法就是在項(xiàng)目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有以下幾個(gè)參數(shù):
"unspecified"
默認(rèn)值 由系統(tǒng)來判斷顯示方向.判定的策略是和設(shè)備相關(guān)的,所以不同的設(shè)備會(huì)有不同的顯示方向.
"landscape"
橫屏顯示(寬比高要長)
"portrait"
豎屏顯示(高比寬要長)
"user"
用戶當(dāng)前首選的方向
"behind"
和該Activity下面的那個(gè)Activity的方向一致(在Activity堆棧中的)
"sensor"
有物理的感應(yīng)器來決定。如果用戶旋轉(zhuǎn)設(shè)備這屏幕會(huì)橫豎屏切換。
"nosensor"
忽略物理感應(yīng)器,這樣就不會(huì)隨著用戶旋轉(zhuǎn)設(shè)備而更改了 ( "unspecified"設(shè)置除外 )。
也可以在Java代碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);來設(shè)置。
如果要讓軟件在橫豎屏之間切換,由于橫豎屏的高寬會(huì)發(fā)生轉(zhuǎn)換,有可能會(huì)要求不同的布局。可以通過以下方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應(yīng)的layout文件不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會(huì)自動(dòng)尋找。
2)通過this.getResources().getConfiguration().orientation來判斷當(dāng)前是橫屏還是豎屏然后來加載相應(yīng)的xml布局文件。因?yàn)楫?dāng)屏幕變?yōu)闄M屏的時(shí)候,系統(tǒng)會(huì)重新呼叫當(dāng)前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中來檢查當(dāng)前的方向,然后可以讓你的SetContentView來載入不同的Layout xml.
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.i("info", "landscape");
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.i("info", "portrait");
}
2.重新載入問題。如果不需要從新載入,可以在androidmanifest.xml中加入配置android:configChanges="orientation",配置android:configChanges的作用就是如文檔所說的:Specify one or more configuration changes that the activity will handle itself. If not specified, the activity will be restarted if any of these configuration changes happen in the system。這樣在程序中. Activity就不會(huì)重復(fù)的調(diào)用onCreate()甚至不會(huì)調(diào)用onPause.onResume.只會(huì)調(diào)用一個(gè)onConfigurationChanged(Configuration newConfig)。
–*************其實(shí)在這里我遇到兩個(gè)奇怪的問題,那就是
1.如果我在android:configChanges中只設(shè)置orientation,他依然會(huì)重新加載,只有設(shè)置了orientation|keyboardHidden它才會(huì)只調(diào)用一個(gè)onConfigurationChanged(Configuration newConfig)
2.當(dāng)橫屏變豎屏的時(shí)候,他會(huì)調(diào)用兩次onConfigurationChanged,而豎屏轉(zhuǎn)橫屏?xí)r他只調(diào)用一次onConfigurationChanged,真是太奇怪了。如果你知道,歡迎留言共同探討*************–
如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中保存之前的操作內(nèi)容或數(shù)據(jù),則需要保存之前的數(shù)據(jù)。然后在activity的onCreate()中取出來。當(dāng)然,如此就不能設(shè)置android:configChanges()了,否則就不會(huì)調(diào)用onCreate()方法。那么數(shù)據(jù)可以保存在哪呢?Android中四種存儲(chǔ)方法都可以,另外,還可以用Android為我們提供了onRetainNonConfigurationInstance()方法來暫時(shí)保存數(shù)據(jù)。
下面為此舉個(gè)例子:
保存臨時(shí)圖片:
@Override
public Object onRetainNonConfigurationInstance() {
final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
keepPhotos(list);
return list;
}
之后便可以在activity的onCreate()函數(shù)中實(shí)現(xiàn)重新調(diào)用臨時(shí)文件,在代碼中需要判斷系統(tǒng)是否需要重新加載臨時(shí)文件。以下是放在OnCreate()函數(shù)中加載臨時(shí)文件的代碼:
private void loadPhotos() {
final Object data = getLastNonConfigurationInstance();
// The activity is starting for the first time, load the photos from Flickr
if (data == null) {
mTask = new GetPhotoListTask().execute(mCurrentPage);
} else {
// The activity was destroyed/created automatically, populate the grid
// of photos with the images loaded by the previous activity
final LoadedPhoto[] photos = (LoadedPhoto[]) data;
for (LoadedPhoto photo : photos) {
addPhoto(photo);
}
}
}
對于大多數(shù)的情況并不需要做如上的操作,所以需要謹(jǐn)慎使用這個(gè)行文,畢竟最好的行為也并不適用于所有情況,如果應(yīng)用的不好反而會(huì)給程序帶來不必要的麻煩。
如果要徹底禁止翻轉(zhuǎn),可以設(shè)置android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應(yīng)帶來的麻煩了。不過不知道為什么,在模擬器上不管用,聽別人說在真機(jī)上是正確的,我沒有真機(jī),等有了真機(jī)再試試看。
相關(guān)文章
android利用消息機(jī)制獲取網(wǎng)絡(luò)圖片
這篇文章主要為大家詳細(xì)介紹了android利用消息機(jī)制獲取網(wǎng)絡(luò)圖片的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android清空編輯框內(nèi)容功能的實(shí)現(xiàn)實(shí)例代碼
本篇文章主要介紹了Android清空編輯框數(shù)據(jù)功能的實(shí)現(xiàn)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03
基于Flutter制作一個(gè)長按展示操作項(xiàng)面板的桌面圖標(biāo)
Flutter是一種強(qiáng)大的跨平臺(tái)移動(dòng)應(yīng)用程序框架,它能夠幫助開發(fā)者輕松地創(chuàng)建漂亮、快速、高效的應(yīng)用程序,本文的主題是如何在Flutter中制作一個(gè)長按展示操作項(xiàng)面板的桌面圖標(biāo),在某些場景下,這個(gè)功能會(huì)讓應(yīng)用程序更加便利和易用2023-06-06
Android checkbox的listView具體操作方法
這篇文章主要介紹了Android checkbox的listView具體操作方法,重點(diǎn)就是存儲(chǔ)每個(gè)checkbox的狀態(tài)值,感興趣的小伙伴們可以參考一下2015-12-12
Android開發(fā)之瀑布流控件的實(shí)現(xiàn)與使用方法示例
這篇文章主要介紹了Android開發(fā)之瀑布流控件的實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式分析了Android瀑布流控件的定義與使用方法,需要的朋友可以參考下2017-10-10
Android?studio實(shí)現(xiàn)日期?、時(shí)間選擇器與進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)日期、時(shí)間選擇器與進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
手把手教你實(shí)現(xiàn)Android編譯期注解
今天給大家介紹Android編譯期注解sdk的步驟以及注意事項(xiàng),并簡要分析了運(yùn)行時(shí)注解以及字節(jié)碼技術(shù)在生成代碼上與編譯期注解的不同與優(yōu)劣,感興趣的朋友一起看看吧2021-07-07

