android 判斷橫豎屏問題的詳解
Android橫豎屏要解決的問題應(yīng)該就兩個:一。布局問題;二。重新載入問題。
1.布局問題:如果不想讓軟件在橫豎屏之間切換,最簡單的辦法就是在項目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有以下幾個參數(shù):
"unspecified"
默認(rèn)值 由系統(tǒng)來判斷顯示方向.判定的策略是和設(shè)備相關(guān)的,所以不同的設(shè)備會有不同的顯示方向.
"landscape"
橫屏顯示(寬比高要長)
"portrait"
豎屏顯示(高比寬要長)
"user"
用戶當(dāng)前首選的方向
"behind"
和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
"sensor"
有物理的感應(yīng)器來決定。如果用戶旋轉(zhuǎn)設(shè)備這屏幕會橫豎屏切換。
"nosensor"
忽略物理感應(yīng)器,這樣就不會隨著用戶旋轉(zhuǎn)設(shè)備而更改了 ( "unspecified"設(shè)置除外 )。
也可以在Java代碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);來設(shè)置。
如果要讓軟件在橫豎屏之間切換,由于橫豎屏的高寬會發(fā)生轉(zhuǎn)換,有可能會要求不同的布局??梢酝ㄟ^以下方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應(yīng)的layout文件不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會自動尋找。
2)通過this.getResources().getConfiguration().orientation來判斷當(dāng)前是橫屏還是豎屏然后來加載相應(yīng)的xml布局文件。因為當(dāng)屏幕變?yōu)闄M屏的時候,系統(tǒng)會重新呼叫當(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就不會重復(fù)的調(diào)用onCreate()甚至不會調(diào)用onPause.onResume.只會調(diào)用一個onConfigurationChanged(Configuration newConfig)。
–*************其實在這里我遇到兩個奇怪的問題,那就是
1.如果我在android:configChanges中只設(shè)置orientation,他依然會重新加載,只有設(shè)置了orientation|keyboardHidden它才會只調(diào)用一個onConfigurationChanged(Configuration newConfig)
2.當(dāng)橫屏變豎屏的時候,他會調(diào)用兩次onConfigurationChanged,而豎屏轉(zhuǎn)橫屏?xí)r他只調(diào)用一次onConfigurationChanged,真是太奇怪了。如果你知道,歡迎留言共同探討*************–
如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中保存之前的操作內(nèi)容或數(shù)據(jù),則需要保存之前的數(shù)據(jù)。然后在activity的onCreate()中取出來。當(dāng)然,如此就不能設(shè)置android:configChanges()了,否則就不會調(diào)用onCreate()方法。那么數(shù)據(jù)可以保存在哪呢?Android中四種存儲方法都可以,另外,還可以用Android為我們提供了onRetainNonConfigurationInstance()方法來暫時保存數(shù)據(jù)。
下面為此舉個例子:
保存臨時圖片:
@Override
public Object onRetainNonConfigurationInstance() {
final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
keepPhotos(list);
return list;
}
之后便可以在activity的onCreate()函數(shù)中實現(xiàn)重新調(diào)用臨時文件,在代碼中需要判斷系統(tǒng)是否需要重新加載臨時文件。以下是放在OnCreate()函數(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)慎使用這個行文,畢竟最好的行為也并不適用于所有情況,如果應(yīng)用的不好反而會給程序帶來不必要的麻煩。
如果要徹底禁止翻轉(zhuǎn),可以設(shè)置android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應(yīng)帶來的麻煩了。不過不知道為什么,在模擬器上不管用,聽別人說在真機(jī)上是正確的,我沒有真機(jī),等有了真機(jī)再試試看。
相關(guān)文章
Android自定義view實現(xiàn)滾動選擇控件詳解
最近在開發(fā)中需要實現(xiàn)滾動進(jìn)行類別的選擇,也就是我們所說的滾動選擇器,這里我們自定義來實現(xiàn)這個功能,這篇文章主要介紹了Android自定義view實現(xiàn)滾動選擇控件2022-11-11Android內(nèi)存泄漏排查利器LeakCanary
這篇文章主要為大家詳細(xì)介紹了Android內(nèi)存泄漏排查利器LeakCanary的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03Android app應(yīng)用多語言切換功能實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android app應(yīng)用多語言切換功能實現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-08-08Android編程實現(xiàn)3D立體旋轉(zhuǎn)效果的實例代碼
這篇文章主要介紹了Android編程實現(xiàn)3D立體旋轉(zhuǎn)效果的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Android自定義View實現(xiàn)繪制虛線的方法詳解
這篇文章主要給大家介紹了Android自定義View實現(xiàn)繪制虛線的方法,在繪制過程中走了一些彎路才實現(xiàn)了虛線的效果,所以想著總結(jié)分享出來,方便有需要的朋友和自己在需要的時候參考學(xué)習(xí),下面來一起看看吧。2017-04-04Android Studio連接手機(jī)設(shè)備教程
這篇文章主要為大家詳細(xì)介紹了Android Studio連接手機(jī)設(shè)備教程,非常完整的連接步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07Android的RV列表刷新詳解Payload與Diff方式異同
這篇文章主要為大家介紹了Android的RV列表刷新詳解Payload與Diff方式異同,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10