温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android中怎么实现横竖屏处理

发布时间:2021-06-09 17:35:58 来源:亿速云 阅读:463 作者:Leah 栏目:移动开发

这篇文章给大家介绍Android中怎么实现横竖屏处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

界面旋转方向的决定因素

决定一个界面显示为横屏/竖屏的因素有几个:

  • 系统的设置项,一般可以设置为只允许竖屏或可旋转切换。

  • 设备的物理传感器感应到的设备方向。

  • 不同 App 里的代码对横竖屏的设置。

需要注意的一点是,这三个因素没有固定的优先级。所以即使系统的设置项中设置了固定为竖屏,App 里的代码也可以将界面设置为横屏,当然影响的范围仅限于 App 内部界面。

代码中设置横竖屏的方法

我们有2种方法设置横竖屏:

在 AndroidManifest.xml 文件中,对 <activity> 标签设置 android:screenOrientation 属性,具体的值和作用见下文。
在 Java 中调用 Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) ,具体的值和作用见下文。

如果在 xml 中设置,则在初始化界面时就已经确定好其方向。而在如果 Java 中设置,则可以做到根据不同情况动态设置。

设置横竖屏时传入的值和作用

以下列出在 AndroidManifest.xml 中 <activity> 标签的 android:screenOrientation 属性的可能的值。如果采用 Java 方式设置,参数与之一一对应。(参考官方文档 )

  • unspecified :默认值,不做任何指定,由系统来决定显示方向。这将由上一个 activity 来决定,或者当 activity 处于栈底时由用户设置的方向来决定。

  • landscape : 保持横屏。

  • portrait : 保持竖屏。

  • user : 用户当前设置的 orientation 值。

  • behide : 保持和上一个 Activity 的方向一致。

  • sensor : 完全根据物理传感器的方向来决定。注意用这个值时会忽略用户在系统设置中的旋转开关状态。(注意一般机器即使用这个值也不会支持竖屏旋转180度)

  • nosensor : 忽略物理传感器的方向。这将导致用户旋转手机时不会切换横竖屏。

  • sensorLandscape : 保持横屏,但可以根据物理传感器来决定横屏的方向。

  • sensorPortrait : 保持竖屏,但可以根据物理传感器来决定竖屏的方向。

  • reverseLandscape : 保持横屏,但方向与使用 landscape 时相反。

  • reversePortrait : 保持竖屏,但方向与使用 portrait 时相反。

  • fullSensor : 与 sensor 大致相同,区别在于这个属性会允许4个方向都可以旋转。

  • userLandscape : 保持横屏,但可以在用户允许旋转的情况下,根据物理传感器来决定横屏的方向。(注意与 sensorLandscape 对比)

  • userPortrait : 保持竖屏,但可以在用户允许旋转的情况下,根据物理传感器来决定竖屏的方向。(注意与 sensorPortrait 对比)

  • fullUser : 与 user 大致相同,区别在于如果用户允许旋转,这个属性允许4个方向都可以旋转。

  • locked : 屏幕方向会锁定在当前方向,不能再旋转。

该属性的值有很多,但一般比较常用的几个值也就几个: unspecified (允许旋转)、 landscape (固定为横屏)、 portrait (固定为竖屏)。而且一般我们只需要在 AndroidManifest.xml 中指定好固定的值就可以了。除非你对横竖屏切换有自己的一套逻辑,才需要在不同的逻辑下进行不同的设置。

横竖屏切换时引起的 Activity 重新创建

默认情况下,横竖屏切换会引起当前 Activity 销毁然后重新创建。所以我们可以在 Activity 重新创建时根据当前横竖屏状态做一些差异化。最常见的就是根据横竖屏采用不同的 layout xml。

在 res 目录下建立 layout-land 和 layout-port 目录,在不同目录下分别放一个同名的 layout xml 文件,然后在代码里正常使用这个 layout 文件,系统就会在横竖屏切换并重新创建 Activity 时自动使用对应的 layout 文件。如:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_layout);
}

如果不想通过创建多个 layout 文件来区分横竖屏布局,也可以用 Java 代码来做一些差异化,只要使用以下判断即可获取当前横竖屏的信息。

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_layout);
  // 获取横竖屏信息
  int orientation = getResources().getConfiguration().orientation;
  if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // 针对横屏做一些处理
  } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // 针对竖屏做一些处理
  }
}

有一个点需要注意,关于 Activity 的生命周期被重新调用,有的资料说:

当不设置 Activity 的 android:configChanges 属性时,切到横屏时会重新执行一次生命周期,而切到竖屏时会执行两次。

如果设置了 android:configChanges="orientation" 属性,则都只会执行一次。

但是个人实验没有验证出这个说法。保险起见,可以加上 android:configChanges="orientation" 属性,确保生命周期只调用一次。

阻止横竖屏切换时 Activity 重启

虽然我们可以用上面的方法对横竖屏做不同的布局,但是横竖屏切换导致的 Activity 重新创建还会引起用户当前状态、数据的丢失。例如 EditText 中输入到一半的文字在 Activity 重新创建后会丢失。所以如果有办法能在旋转屏幕时不重新创建 Activity,应该是更好的一种选择。

我们可以在 AndroidManifest.xml 中为相应的 <activity> 设置 android:configChanges 属性,让它不在横竖屏切换时引起 Activity 的重新创建。

Android 3.2(API Level 13)以前的 SDK 可以使用如下配置

android:configChanges="orientation|keyboardHidden"

而 Android 3.2 以后的 SDK 则需要设置为

android:configChanges="keyboardHidden|orientation|screenSize"

这样一来,横竖屏切换时 Activity 将不会重新创建。

横竖屏切换时的回调

一旦我们按照上述方法设置了 android:configChanges 属性,那么横竖屏切换时 Activity 将不会重新创建,那么当屏幕旋转时,我们在代码上怎么感知呢?可以通过 Override Activity 和 View 的 onConfigurationChanged 方法。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
  super.onConfigurationChanged(newConfig);
  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    // 针对横屏做一些处理
  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    // 针对竖屏做一些处理
  } 
}

判断当前屏幕方向

有了上面的横竖屏切换的回调,我们就可以及时感知到屏幕的状态变化。但因为竖屏、横屏都有两个不同的方向,所以 Android 系统又提供了方法给我们获取当前屏幕精确的旋转方向。

Display display = activity.getWindowManager().getDefaultDisplay();
int rotation = display.getRotation();
//
// rotation 的值表示了当前屏幕的旋转角度,可能的值有:
// Surface.ROTATION_0、Surface.ROTATION_90、
// Surface.ROTATION_180、Surface.ROTATION_270。
//

这样我们就可以判断当前屏幕的方向了。

举个例子,以下方法获取当前屏幕的旋转方向,然后将旋转方向锁定,使用户不能再旋转。

public static void lockScreenOrientation(Activity activity) {
  Display display = activity.getWindowManager().getDefaultDisplay();
  switch (display.getRotation()) {
    case Surface.ROTATION_90:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      break;
    case Surface.ROTATION_180:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
      break;
    case Surface.ROTATION_270:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
      break;
    default:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  }
}

关于Android中怎么实现横竖屏处理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI