當前位置:首頁 » 安卓系統 » android橫豎屏切換數據保存數據

android橫豎屏切換數據保存數據

發布時間: 2023-05-15 03:14:05

㈠ android怎麼設置橫豎屏切換

方法一:

1、首先在android手機打開「設置」這個選項的,點擊「顯示」這個功能;

㈡ 淺談activity橫豎屏切換時如何保存數據

1、旋轉時數據為什麼會丟失?

2、onSaveInstanceState與onPause的區別李拿
要特別強調的是,onSaveInstanceState 並不是生命周期方法,Android 系統並不保證在殺死 activity 前一定調用它:
當 activity 進入後台或者被銷毀時 onPause() 總會被調到;當 activity 被銷毀時 onStop() 總會被調到;而 onSaveInstanceState() 不會被調到的兩種情況
①當 activity B被調到activity A 上面,並且在B的生命周期內A未被殺掉,系統不會為A調用這個方法。因為A仍保持它原來的用戶交互的狀態。
②當用戶按返回鍵從 activity B 返回到 activity A,系統不會為B調用這個方法。因為B的實例已被銷毀,所以沒有必要恢復狀態。
而嚴謹的你產生了疑問,既然onPause總會被調到,為什麼不在onPause中保存數據,而要額外缺沒增加一個API做這件事情呢?
答案:要分清場合。
程序員確實需要在onPause中保存數據(在onStop中做可能就來不及了),但是一般情況下保存的是永久性數據,比如preference、database、json file,可能還要給 thread、service 做處理;
重點:
而一些暫時的數據呢?比如上面哪扮搭講的情況,只是旋轉了屏幕,程序員就可以把當前頁數放進 Bundle 中,交給 Application 保管。

3、旋轉時方法的調用流程
旋轉發生了,activity 實例被銷毀:
onPause() // 存儲永久數據
onSaveInstanceState(Bundle) // 存儲暫時數據,在onStop前被調用
onStop()
onDestroy()

重建 activity 實例:
onCreate(Bundle) // 獲取暫存數據
onStart()
onRestoreInstanceState(Bundle) // 也可在這獲取暫存數據,在onStart後被調用
onResume() // 做對應於onPause的恢復的工作

㈢ Android的 MySurfaceView 的橫 豎屏切換問題

一、禁止橫豎屏轉換
Android橫豎屏切換在手機開發中比較常見,很多軟體在開發過程中為了避免橫豎屏切換時引發不必要的麻煩,通常禁止掉橫豎屏的切換,
通過在AndroidManifest.xml中設置activity中的android:screenOrientation屬性值來實現。
比如下列設置
android:screenOrientation="portrait"
則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation="landscape",為橫屏顯示。
上述修改也可以在java代碼中通過類似如下代碼來設置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
另外,android中每次屏幕的切換動會重啟Activity,所以應該在Activity銷毀前保存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的游戲就不會自動重啟了!

二、橫豎屏切換
如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的布局。可以通過以下兩種方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程序為調用Activity的onCreate方法,從而載入相應的布局。
2)假如布局資源不按照如上設置,則可以通過java代碼來判斷當前是橫屏還是豎屏然後來載入相應的xml布局文件。因為當屏幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的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"); // 豎屏
}
三、通過onConfigurationChanged攔截橫豎屏變換
按照二的操作,Activity每次橫豎屏切換都會重新調用onPause-> onStop-> onDestory-> onCreate->onStart->onResume,為此涉及到內容和數據的保存和讀取,否則轉屏之前的內容就會消失了。很多時候這樣的結果讓程序繁瑣,為此Android提供了在manifest中設置android:configChanges屬性,從而讓Activity不延續上述的重建流程。在Android工程的Mainfest.xml中配置Activity:android:configChanges="keyboardHidden|orientation",橫豎屏切換之後就不會去執行OnCreat函數了,而是會去調用onConfigurationChanged()這樣就能控制橫豎屏的切換了。用戶可以在Activity或View的onConfigurationChanged(Configuration newConfig)函數中獲取當前橫豎屏參數。至於其調用順序跟touch時間的傳遞順序相似,不過他沒有消費事件的概念,會順次調用到每一個onConfigurationChanged函數。
需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
需要注意的是,onConfigurationChanged函數中只能獲得橫豎屏切換後的參數,在該函數中獲取不到新的Layout和控制項的尺寸位置信息,如果要處理尺寸和位置信息,必須通過消息非同步或者延時調用。
四、徹底禁止翻轉
當然如果要徹底禁止翻轉,可以設置android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應帶來的麻煩了。不過在模擬器上不管用,在真機上是正確的。
這里提一個小知識,Android模擬器中,快捷鍵"Ctrl+F11/F12"可以實現轉屏
五,自適應轉換
如果想讓它啟動的時候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然後手機切換橫豎屏就不能用了該怎麼解決呢?
首先:在Mainfest.xml中追加
android:screenOrientation="sensor" android:configChanges="orientation|keyboardHidden"
這兩個屬性。
第二步:取得屏幕的長和寬,進行比較設置橫豎屏的變數。
1. Display display = getWindowManager().getDefaultDisplay();
2. int width = display.getWidth();
3. int height = display.getHeight();
4. if (width > height) {
5. orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; //橫屏
6. } else {
7. orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; //豎屏
8. }
第三步:在onConfigurationChanged()函數中追加this.setRequestedOrientation(orientation)就行了
1. public void onConfigurationChanged(Configuration newConfig) {
2. super.onConfigurationChanged(newConfig);
3. this.setRequestedOrientation(orientation);
4. }
但是這樣的話你切到別的畫面的時候再回到原畫面,它就仍然是橫的或者是縱的。怎麼讓它從別的屏幕回來後,又重新橫豎屏布局呢?
只要在OnResume()中在設定下就行了。但是這個只支持橫豎屏只有一個layout的。橫豎屏分別對應layout的還不知道該怎麼解決。
1. protected void onResume() {
2. orientation = ActivityInfo.SCREEN_ORIENTATION_USER;
3. this.setRequestedOrientation(orientation);
4. Display display = getWindowManager().getDefaultDisplay();
5. int width = display.getWidth();
6. int height = display.getHeight();
7. if (width > height) {
8. orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
9. } else {
10. orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
11. }
12. super.onResume();
13. }
六、總結
總之,對於橫豎屏切換的問題,統計了下,大家的解決辦法是:
①不理會。。
②只豎屏顯示(android:screenOrientation="portrait")
只橫屏顯示(android:screenOrientation="landscape")
③簡單的防止重載:
在 AndroidManifest.xml中加入:android:configChanges="orientation|keyboardHidden"
在activity中重載onConfigurationChanged事件
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);
}
④橫豎屏分別布局
橫豎屏分別布局的方法是:
在res下新建
layout-land 橫屏
layout-port 豎屏
然後把layout中的xml文件分別考到以上目錄,修改布局就可以了代碼中不做任何更改。
在 AndroidManifest.xml文件中的 主Activity中加入
android:configChanges="orientation|keyboardHidden"
然後在主Activity中的onConfigurationChanged加入
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);

if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.main); //布局
tv = (TextView) findViewById(R.id.EditText01); //控制項
}

if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.main); //布局
tv = (TextView) findViewById(R.id.EditText01); //控制項
}
}
七、示例詳細步驟
//------ 第一步:獲得許可
需要在中添加相應許可
//------ 第二步:根據不同的目標,針對Activity進行設置
目標1:屏蔽橫豎屏的切換
步驟:為Activity設置一個默認的屏幕方向 方法如下:
在AndroidManifest.xml中找到該Activity 添加代碼:

android:name=".ActivityName"
android:screenOrientation="landscape"
>
設置Activity的默認方向為「橫向」
此處的screenOrientation有如下選項:
==================================================================
= unspecified 默認值,由系統判斷狀態自動切換
= landscape 橫屏
= portrait 豎屏
= user 用戶當前設置的orientation值
= behind 下一個要顯示的Activity的orientation值
= sensor 使用感測器 感測器的方向
= nosensor 不使用感測器 基本等同於unspecified
==================================================================
目標2:防止Activity的銷毀
步驟:為Activity設置configChanges屬性
在AndroidManifest.xml中找到該Activity 添加代碼:

android:name=".ActivityName"
android:configChanges="orientation|keyboardHidden"
>
此處的configChanges有如下選項:
==================================================================
= orientation 屏幕在縱向和橫向間旋轉
= keyboardHidden 鍵盤顯示或隱藏
= fontScale 用戶變更了首選的字體大小
= locale 用戶選擇了不同的語言設定
= keyboard 鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤
= touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件
==================================================================
如果需要多個選項 用"|"隔開
此處注意:如果是在實體機上測試橫豎屏切換 需要orientation選項
【重點】如果要使得程序可以在Android模擬器上測試 需要寫orientation|keyboardHidden
如果缺少了keyboardHidden選項 不能防止Activity的銷毀
並且在之後提到的onConfigurationChanged事件中 只能捕獲豎屏變橫屏的事件 不能捕獲橫屏變豎屏
目標3:捕獲橫豎屏切換的事件
步驟:在Activity中(ActivityName.java)重寫onConfigurationChanged事件
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation)
{
//更改為LANDSCAPE
case (Configuration.ORIENTATION_LANDSCAPE):
//如果轉換為橫向屏時,有要做的事,請寫在這里
break;
//更改為PORTRAIT
case (Configuration.ORIENTATION_PORTRAIT):
//如果轉換為豎向屏時,有要做的事,請寫在這里
break;
}
}
八、備註:
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

㈣ Android GridView橫豎屏切換會丟失數據

如果你想要禁止橫豎屏切換的話可以在配置中修改.
你說有問題,但不知有什麼問題,如果你怕數據丟失
在切換的時候會調用onConfigrationChange方法,才進行切換,你可以重載他,把你的數據進行保存。

㈤ android自定義布局中的平滑移動 ,當屏幕橫豎切換人時候,怎樣保存原來的值

橫豎切換的時候,默認逗肢再次載入本頁面 也就是說 再次調用了activity 的oncreate()方法 在manifest 注冊activity的基棚時候加入 android:configChanges="orientation|keyboardHidden" 橫豎屏切換 不重新載入本activity,以前的變數搏指則或者集合 都不會發生改變!

㈥ android 橫豎屏切換怎麼禁止重載

Activity每次橫豎屏切換(包括用setRequestedOrientation調用)都會重新調用一輪onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,從而銷毀蠢褲原來的Activity對象,創建新的Activity對象,這是因為通常情況下軟體在橫豎屏之間切換,界面的高寬會發生轉換,從而可能會要求不同的布局。具體的布局切換可以通過如下兩種方法來實現:帶純簡
1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程序自己會調用Activity的onCreate方法,從而根據當前橫豎屏情況自動載入響應的布局。
2)假如布局資源是不一樣又不按照如上設置,則需要通過java代碼來判斷當前是橫屏還是豎屏然後來載入相應的xml布局文件褲談(比如mainP為豎屏mainL為橫屏)。因為當屏幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml。
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
int mCurrentOrientation = getResources().getConfiguration().orientation;
if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
// If current screen is portrait
Log.i("info", "portrait"); // 豎屏
setContentView(R.layout.mainP);
} else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
//If current screen is landscape
Log.i("info", "landscape"); // 橫屏
setContentView(R.layout.mainL);
}
init();//初始化,賦值等操作
findViews();//獲得控制項
setListensers();//設置控制項的各種監聽方法
}
上面只是對布局切換做了描述,實際上由於重啟Activity在未加處理的情況下必然導致數據的丟失和重新獲取,這樣用戶體驗會非常差。為此就要在切換前對數據進行保存,切換重啟後對數據進行恢復,具體操作的步驟如下:
重寫Activity.(),用戶橫豎屏切換前保存數據
@Override
public Object () {
final MyDataObject data = collectMyLoadedData();
return data;
}
在onCreate()函數中調用(),獲取()保存的數據
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final MyDataObject data = (MyDataObject) ();
if (data == null) {
data = loadMyData();
}
...
}

㈦ android 橫屏和豎屏布局不同時,需要onCreate()重新載入,如何不重新載入讓數據保存,並切換不同的布局

Activity橫豎屏切換的時候會重新onCreate,如果不想重裝載,需要以下設置:

在AndroidManifest.xml的每一個需要禁止轉向的Activity配置中加入android:screenOrientation=」landscape」屬性。

參數說明:

  1. landscape = 橫向

  2. portrait = 縱向


避免在轉屏時重啟Activity

android中每次屏幕方向切換時都會重啟Activity,所以應該在Activity銷毀前保存當前活動的狀態,在Activity再次 Create的時候載入配置,那樣,進行中的游戲就不會自動重啟了!
要避免在轉屏時重啟Activity,可以通過在AndroidManifest.xml文件中重新定義方向(給每個Activity加上android:configChanges=」keyboardHidden|orientation」屬性)。
在需要控制屏幕顯示方向的Activity中重寫onConfigurationChanged(Configuration newConfig)方法,這樣在轉屏時就不會重啟Activity了。

㈧ 當Android旋轉屏幕導致橫豎屏切換時,如何保存當前Fragment的實例

總結了以下幾種情況:

  • 設備旋轉時保存Activity的交互狀態: onSaveInstanceState();

  • 設備旋轉時保存Fragment的交互狀態: setRetainInstance(true);

  • 設備旋轉時保存WebView的數據:

  • android:configChanges="keyboardHidden|orientation|screenSize";

  • 設備旋轉時保存在自定義View中繪制的圖形。

如果Fragment不包含WebView,只是簡單的UI View,像是TextView, Button, CheckBox, ImageView... 不建議使用setRetainInstance方法,只需要記住當前fragment的index,然後在設備旋轉後根據數據重新實例化一個fragment。因為不包含大量數據,旋轉的過程中幾乎可以用「無縫切換」來形容。
如果包含WebView還是採用針對WebView的方法(題主的情況)。所以要看情況而定。

熱點內容
關閉androidstudio 發布:2025-02-14 03:53:42 瀏覽:18
安卓腳本一鍵打板 發布:2025-02-14 03:50:16 瀏覽:866
我的世界租賃伺服器會被封ip嗎 發布:2025-02-14 03:46:05 瀏覽:982
資料庫附 發布:2025-02-14 03:44:43 瀏覽:837
安卓系統解不了鎖怎麼辦 發布:2025-02-14 03:44:35 瀏覽:552
怎麼查詢信用卡密碼 發布:2025-02-14 03:42:04 瀏覽:318
studio外貿服裝直播腳本 發布:2025-02-14 03:34:16 瀏覽:453
python集合運算符 發布:2025-02-14 03:06:18 瀏覽:205
pic編譯軟體 發布:2025-02-14 03:01:04 瀏覽:984
反編譯在編譯 發布:2025-02-14 02:55:36 瀏覽:418