android實現屏幕旋轉切換fragment


Fragment的小知識點


  • fragment不允許有帶參構造,當需要對成員變量進行改變時,可以通過靜態方法來實現,示例代碼:

    public static MyFragment newInstance(int num){
        MyFragment fragment = new MyFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("count",num);
        fragment.setArguments(bundle);
        return fragment;
    }
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        int num = bundle.getInt("count");
        count = num;
    }
    

Android屏幕旋轉之橫豎屏切換的是實現


實現屏幕自動/手動旋轉的方式有兩種:

一種是在工程的代碼中定義,這種方式在橫豎屏切換時執行的操作是:銷毀當前Activity–根據新的屏幕尺寸重建Activity。如果不進行數據存儲的操作,在切換的過程中Activity中的數據會丟失。

另一種是在工程的AndroidManifest.xml中定義,這種定義的方式在某些情況下可以實現“不銷毀需要橫豎屏的Activity”,因為這種方式不會銷毀Activity后重建Activity,因此Activity的數據不會丟失。

方式一:代碼中定義

在需要橫屏的Activity中的onCreate方法內添加如下語句,並且要求該語句位於onCreate方法內setContentView(**)語句之前。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

由於該方式下橫/豎屏切換時,對應的Activity的數據會丟失,可以在對應的Activity中重寫如下兩個方法,來保證數據不丟失:

@Override
protected void onSaveInstanceState(Bundle outState) {
 super.onSaveInstanceState(outState);
 //橫豎屏切換前調用,保存用戶想要保存的數據,以下是樣例
 outState.putString("name","yoosir"); 
 outState.putInt("age",24); 
 outState.putBoolean("handsome",true);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
 super.onRestoreInstanceState(savedInstanceState);
 // 屏幕切換完畢后調用用戶存儲的數據,以下為樣例:
 if(savedInstanceState != null) { 
  int age = savedInstanceState.getInt("age"); 
  String name = savedInstanceState.getString("name"); 
  boolean isHandsome = savedInstanceState.getBoolean("handsome");
 }
}

方式二:在AndroidManifest.xml中定義

在AndroidManifest.xml中對應的Activity屬性定義中配置android:configChanges和screenOrientation。參考的文章中在android:configChanges的配置說的很清楚,我直接把結論貼出來:

android:configChanges="orientation|keyboardHidden|screenSize"
  • 配置configChanges為以上配置時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。Activity中的數據不會被銷毀。
  • 不配置configChanges或配置configChanges為非以上配置時,切屏會重新調用當前Activity的各個生命周期。Activity中的數據會被銷毀。

給出示例代碼如下:

<activity android:name=".com.cdsn.SearchActivity" ... ... android:screenOrientation="sensor" android:configChanges="keyboardHidden|orientation|screenSize"   />

上述代碼中的android:screenOrientation所有可能的參數配置如下 。

描述
unspecified 默認值。系統自動選擇屏幕方向
behind 跟activity堆棧中的下面一個activity的方向一致
landscape 橫屏方向,顯示的寬比高長
portrait 豎屏方向,顯示的高比寬長
sensor 由設備的物理方向傳感器決定,如果用戶旋轉設備,這屏幕就會橫豎屏切換
nosensor 忽略物理方向傳感器,這樣就不會隨着用戶旋轉設備而橫豎屏切換了(”unspecified”設置除外)
user 用戶當前首選的方向
reverseLandscape API 9 以上,反向橫屏
reversePortrait API 9 以上,反向豎屏
sensorLandscape API 9 以上,橫屏,但是可以根據 物理方向傳感器來切換正反向橫屏
sensorPortrait API 9 以上,豎屏,但是可以根據 物理方向傳感器來切換正反向豎屏
fullSensor API 9 以上,上下左右四個方向,由物理方向傳感器決定
locked API 18 以上,鎖死當前屏幕的方向

上述代碼中的android:configChanges所有可能的參數配置如下:

描述
mcc IMSI移動台的國家代碼(MCC)發生變化——一個SIM被探測到並且更新MCC
mnc IMSI移動台的網絡代碼(MNC)發生變化——一個SIM被探測到並且更新MNC
locale 區域發生變化——用戶選擇了一個文本需要顯示的新語言
keyboard 鍵盤類型發生變化——例如:用戶插入了外接鍵盤。
keyboardHidden 鍵盤的可訪問性發生變化——例如:用戶發現了硬件鍵盤。
screenLayout 屏幕布局發生變化——這個會導致顯示不同的Activity。
orientation 屏幕方向發生變化——用戶旋轉了屏幕。注意:如果應用程序的目標API級別是13或更高(通過屬性minSdkVersion和屬性targetSdkVersion聲明),你也需要聲明配置項screenSize,因為這將在設備選擇肖像和屏幕方向時發生改變。
screenSize 當前可用屏幕大小發生變化。這代表一個當前可用大小的變化,和當前的比率相關,因此當用戶選擇不同的畫面和圖像,會發生變化。然而,如果你的程序目標API級別是12或更低,你的Activity總是會自己處理這個配置變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的設備上)。在API級別13里加入的。
smallestScreenSize 物理屏幕大小的變化。不管方向的變化,僅僅在實際物理屏幕打包變化的時候,如:外接顯示器。這個配置項的變化引起在smallestWidth configuration里的變化。然而,如果你的程序目標API級別是12或更低,你的Activity將自己處理這個變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的設備上)在API級別13里加入的。
layoutDirection 布局方向變化。例如書寫方式從左向右(LTR)轉換為從右向左(RTL)

配置了以上屬性之后,進行橫豎屏切換的Activity的數據不會丟失,如果想根據不同的屏幕方向來展示不同UI或做不同的事,需要在該Activity中重寫以下方法:

@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 在這里添加屏幕切換后的操作}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM