1. 程式人生 > >Android 多Fragment螢幕旋轉的問題

Android 多Fragment螢幕旋轉的問題

平時寫專案的時候會碰到一些需求是涉及到螢幕旋轉的,如果旋轉螢幕,你的介面佈局什麼都沒改變的話,那就很簡單了,但是如果當你螢幕旋轉後,需要更改頁面佈局的話,那就有點麻煩了。
舉個簡單的例子:
一開始新建一個專案,studio已經自動幫你新建好hello world的程式碼。執行,然後手機設定可旋轉螢幕。
當你旋轉螢幕,你看到其實頁面沒什麼變化,還是一樣的佈局。但是這個顯示的Activity卻已經變化了。
任何“設定”(Configuration)的改變都可能對Activity的介面造成影響,這時系統會銷燬並重建Activity以便反映新的Configuration。 例如orientation,screenSize,字型大小,語言等都是屬於configuration,如果你在系統設定裡改變了這些,是需要反映到你的app上,那麼就會銷燬現有的activity,然後重新建立activity顯示。該activity先走了onPause,onStop,onDestroy,然後在onCreate。
假設螢幕旋轉前,使用者正在手機上填寫一個登錄檔單,如果處理不當,使用者會發現旋轉後的表單變成空白的了,嚴重影響使用體驗。
分兩種情況講:

  1. 如果你的activity只有一種佈局(橫豎屏都是一樣的),那你旋轉的話,什麼程式碼都不用寫。你的頁面還是一模一樣的。如果你頁面上有EditText,然後輸入一些內容,當你旋轉後發現這個輸入框中還是有你剛剛輸入的內容。明明說Activity重新建立了,為什麼EditText中還有內容呢?這是因為Google已經考慮到這種情況,對一些基本的控制元件做了處理,例如EditText,在旋轉時會記錄該EditText中的內容,當旋轉後activity重新建立後,會重新給該EditText賦值。但是不是所有的控制元件都有這種恢復能力。
    當然如果你介面上還有其他控制元件的話,沒有恢復能力,那你又只有一種佈局的話,其實只要設定旋轉對其activity無影響就好了。那就是在manifest中給該activity設定android:configChanges="orientation|screenSize|keyboardHidden"

    orientation,螢幕介面旋轉(可能是使用者手動旋轉的),【注意:如果你的開發API等級等於或高於13,你還需要設定screenSize,因為screenSize會在螢幕旋轉時改變】。keyboardHidden,鍵盤輔助功能改變。
    注意,如果你給activity設定了這個,那麼當你旋轉的時候,就算你佈局有橫豎屏兩種,他也不會變了。這時候他顯示的佈局取決於一開始你開啟這個app時的佈局。比如說當你開啟app的時候,手機橫屏,那麼加載出來的佈局為橫屏佈局,當你再旋轉到豎屏的話,佈局還是顯示為橫屏。那如果你開啟app的時候,手機豎屏,app首先加載出來的佈局是豎屏,當你再旋轉到橫屏的話,還是顯示豎屏。這主要是因為你設定了那個configChanges,設定那個的意思就是當這些configuration發生的時候並不銷燬activity,而是沿用原來的。
    所以這時候oncreate和ondestroy這些宣告週期都不會觸發了,但是會觸發onConfigurationChanged方法。
    如果你需要在橫豎屏旋轉時,處理一些事情的話,可以在這個函式中處理,例如彈個toast什麼的,看你自己的需求。
  2. 如果你的activity有兩種佈局,分為橫豎屏,那麼你的layout就有兩個了。
    橫屏佈局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="landscape" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

豎屏:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="portrait" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

主要就是改了linearlayout的方向。
當你在執行的時候,你會發現在豎屏時在輸入框輸入內容,旋轉至橫屏的時候,輸入框的內容沒了,這是為什麼呢?雖然說光看佈局檔案程式碼,幾乎都是一樣的,但是為什麼會這樣呢?因為你使用了兩個佈局檔案,兩個輸入框看似一樣,但在android這裡理解卻不一定是一樣,雖然都是同樣的輸入框,但是意義可能是不一樣的,可能在豎屏這個是輸入名字,在橫屏是輸入性別的。那如何做到輸入框內容保留呢?那就是給這兩個輸入框都加上id,並且兩個輸入框的id需要一樣,那麼android就會理解為這兩個是一樣輸入框。

現在來講講當activity上顯示多個fragment當遇到螢幕旋轉怎麼辦?
比如你的螢幕上有4個fragment,分別為abcd,按照順序顯示a->b->c->d,那麼當現在顯示c的時候,螢幕旋轉了,按理來講應該是顯示c,但是卻顯示了a,這是因為你的activity未設定configChanges,導致螢幕旋轉重新建立activity,那麼按你程式碼顯示的話,當然是顯示第一個了。那如何做到顯示c呢,你可以給你的activity設定configChanges,這樣就可以了。但是如果你的activity螢幕旋轉時,介面的確需要變化,需要顯示橫屏佈局呢?那設定configChanges當然不行了。那你可以旋轉前先記錄當前顯示哪個fragment,當重新建立完畢後,可以再顯式呼叫去顯示那個fragment。

我專案的需求是,activity沒有橫豎屏佈局,activity上面顯示的fragment們只有一個fragment是有橫豎屏的,記那個有橫豎屏的fragment為a。而其他的fragment旋轉時不需要變,所以我的做法是給該activity設定configChanges,這樣可以保證Activity不會重新建立,其他fragment旋轉的時候也不會出錯,那a怎麼辦呢?如果只是單純設定configChanges的話,剛剛說了會顯示第一個fragment,可能不是a。
那我的做法是監聽activity的onConfigurationChanged這個函式,在這個裡面去判斷當前顯示的fragment是不是a,如果是a則先dismiss掉,然後在重新顯示這個fragment,因為再顯示的時候,頁面已經為橫屏,該fragment是會自己選擇正確的佈局檔案的。那麼就完成了我的需求,看程式碼:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        List<Fragment> frags = getSupportFragmentManager().getFragments();
        Fragment frag;
        for (int i = 0; frags != null && frags.size() > i; i++) {
            frag = frags.get(i);
            if (frag!=null && frag instanceof AFragment) {
                ((AFragment) frag).dismissAllowingStateLoss();
                AFragment temp = new Afragment();
                temp.show(getSupportFragmentManager(),"afragment");
            }
        }
    }

完美解決

相關推薦

Android Fragment螢幕旋轉的問題

平時寫專案的時候會碰到一些需求是涉及到螢幕旋轉的,如果旋轉螢幕,你的介面佈局什麼都沒改變的話,那就很簡單了,但是如果當你螢幕旋轉後,需要更改頁面佈局的話,那就有點麻煩了。 舉個簡單的例子: 一開始新建一個專案,studio已經自動幫你新建好hello wor

android:configuration 處理螢幕旋轉和語言切換等問題

當APP設定為螢幕可旋轉的時候,會發現在旋轉螢幕的過程中,使用者在EditText等控制元件中輸入的內容會隨之消失,這種情況同樣發生在切換系統語言的時候。 列印APP的生命週期,當進行螢幕方向轉換的時候,生命週期如圖: 螢幕方向的轉換,引起了Activi

Android DialogFragment在螢幕旋轉之後,輸入框內的文字消失的原因

在剛開始學習DialogFragment時,建立了一個測試的DialogFragment: public class TestDialogFragment extends DialogFragment{ @NonNull @Overri

Android中禁用螢幕旋轉

在Android中,如果螢幕發生了旋轉(橫向、縱向切換),那麼會非常悲劇。會銷燬當前的Activity,然後重新建立一個新螢幕方向的Activity。由於遊戲中的引數很密集,而且一般不會考慮兩種螢幕的情況,所以需要禁用螢幕旋轉功能(和iPhone中大多數遊戲類似)。  

android 螢幕旋轉 activity中fragment重疊

在activity中使用fragment時,螢幕旋轉時activity會被銷燬重新建立。這是會再次建立一個新的fragment,使多個fragment重疊。這時我們只需要在AndroidManifest.xml檔案中的activity配置中加一個 android

androidfragment的Viewpager旋轉螢幕時異常退出

a.lang.RuntimeException: Unable to start activity ComponentInfo{com.hdj.hookmanager/com.hdj.hookmanager.ManagerAllUserActivity}: android.

Android開發之Fragment切換優化

rst 心得 getc format ref pri 就是 rip eight 問題分析 一直在簡書裏看別人的技術貼,今天我也來寫點自己的心得!最近在寫一個項目用到大量的Fragment後的總結! 我想剛剛接觸安卓的同學或許會這麽寫: FragmentManager

android螢幕旋轉禁止activity重新載入

android螢幕旋轉時預設會重新載入頁面,使用者體驗較差。 如果要禁止重新載入可以用如下方法: AndroidManifest.xml中對應的activity下增加一項 android:configChanges="orientation|screenSize" <act

android框架實現短視訊應用、3D手勢旋轉、banner控制元件、指南針、智慧管家等應用原始碼

Android精選原始碼 android智慧管家app原始碼 Android高仿拼多多分類列表 Android百度地圖例項詳解之仿摩拜單車APP RecyclerView的LayoutManager搭建流式佈局 Android自定義View分享——一個圓形

Android學習筆記之解決螢幕旋轉後Activity重建問題

0.只需在activity類下重寫onSaveInstanceState方法,下面是一個重寫的例項,目的是儲存oncreate()方法中的臨時變數 @Override protected void onSaveInstanceState(Bundle outState)

Android fragment 巢狀時,viewPager不顯示的問題

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/zkll200/article/details/73692518 先看一段錯誤程式碼,這段程式碼寫在一個 Fragment 中: private void initVi

【分享】迅為iTOP4412開發板-Android系統螢幕旋轉設定

1.1概述 Android4.0,Androd4.4原始碼可以編譯成手機模式和平板模式,訊為iTop4412 開發平臺 的Android系統預設編譯為平板模式。客戶需要根據自己的產品設計及應用環境,切換螢幕 的顯示方向,或者固定好一個顯示方向,例如產品中使用不同解析度的顯

Xamarin.Android 開發中遇到旋轉螢幕錯誤

錯誤資訊 : System.NotSupportedException: Unable to find the default constructor on type App5.MyFragment.  Please provide the missing constructor. 錯誤圖片:

Android執行緒-AsyncTask的使用和問題(取消,並行和序列,螢幕切換)

AsyncTask是Android提供的一個執行非同步工作的類,內部其實是運用了執行緒池和Handler來進行非同步任務的執行和與主執行緒的互動。AsyncTask只是一個輔助類,適合執行時間短的非同步任務。 本文基於Android7.0的程式碼來說的。

Androidfragment懶載入的坑(卡頓)

在Android開發中,有很多種情況都是viewpage+fragment左右滑動進行佈局的,例如下面的今日頭條 在今日頭條app上,我們可以看到,其頂部都是一欄的型別資料來源,可滑動,可聯動下面的viewpage裡的fragment,但是很多時候,viewpage+fragment中

Android中通過按鍵旋轉螢幕

Android上的home鍵是系統直接處理的,功能如下: 1:跳轉到Home介面,如果Home程序死掉了,則重新啟動Home程序 2:長按5s,彈出選擇應用的視窗,可以切換應用. 由於需要,我需要修改這裡的部分邏輯,修改後的邏輯不能放出,這裡放出我找到的大概地點 view p

Android 解決螢幕旋轉時重啟onCreate方法

在對應的Activity註冊的時候新增 android:configChanges="orientation|keyboardHidden|screenSize" 就行了。 還可以在這個Activity中新增如下程式碼對螢幕旋轉進行監聽: @Override

Android肝帝戰紀之基於上篇單Activity+Fragment框架,開發電商式導航欄,Fragment切換

電商式導航欄,多Fragment切換 介面構思示意圖 設計思路 在底部的LinearLayout中新增相應的圖示,然後設定tag繫結相應的 Fragment陣列對應的下標值,再點選切換的時候,根據獲取到的tag值,取出陣列中對應下標的Fragment,在

Android 螢幕旋轉事件流程分析

WindowManagerService.java (android-6.0\frameworks\base\services\core\java\com\android\server\wm) [java] view plain copy print?pr

Android實現螢幕旋轉方法總結

本文例項總結了Android實現螢幕旋轉方法。分享給大家供大家參考。具體如下: 在介紹之前,我們需要先了解預設情況下android螢幕旋轉的機制: 預設情況下,當用戶手機的重力感應器開啟後,旋轉螢幕方向,會導致當前activity發生onDestroy-> on