• 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); // 在这里添加屏幕切换后的操作}
    
  • 相关阅读:
    Linux查看当前系统的发行版信息
    用 CentOS 7 打造合适的科研环境
    消息队列的使用场景
    RabbitMQ几种Exchange 模式
    JMS规范概览
    消息队列的学习
    springMVC参数传递实例
    java8时间处理实例
    windows电脑常用必备软件
    http后台json解析实例
  • 原文地址:https://www.cnblogs.com/lxstudy/p/14710017.html
Copyright © 2020-2023  润新知