Android 《屏幕切换》

默认处理机制

除了系统广播之外,App所处的环境也会影响运行,比如手机有竖屏与横屏两种模式,竖屏时水平方向较短而垂直方向较长,横屏时水平方向较长而垂直方向较短。两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之际,甚至会打乱App的生命周期。

无需重启Activity

横竖屏切换,Activity的生命周期会重新走一遍,为了避免横竖屏切换时重新加载界面的情况,Android设计了一种配置变更机制,在指定的环境配置发生变更之时,无须重启活动页面,只需执行特定的变更行为。该机制的编码过程分为两步:

1 .修改AndroidManifest.xml

首先创建新的活动页面ChangeDirectionActivity,再打开AndroidManifest.xml,看到该活动对应的节点配置是下面这样的:

<activity android:name=".ChangeDirectionActivity" />

给这个activity节点增加android:configChanges属性,并将属性值设“orientation|screenLayout|screenSize”,修改后的节点配置如下所示:

<activity
android:name=".ChangeDirectionActivity"
android:configChanges="orientation|screenLayout|screenSize" />

新属性configChanges的意思是,在某些情况之下,配置项变更不用重启活动页面,只需调用onConfigurationChanged方法重新设定显示方式。故而只要给该属性指定若干豁免情况,就能避免无谓的页面重启操作了,配置变更豁免情况的取值说明见表
image

2 .修改活动页面的Java代码

打开ChangeDirectionActivity的Java代码,重写活动的onConfigurationChanged方法,该方法的输入参数为Configuration类型的配置对象,根据配置对象的orientation属性,即可判断屏幕的当前方向是竖屏还是横屏,再补充对应的代码处理逻辑。下面是重写了onConfigurationChanged方法的活动代码例子:

public class ChangeDirectionActivity extends AppCompatActivity {
   private TextView tv_monitor; // 声明一个文本视图对象
   private String mDesc = ""; // 屏幕变更的述说明
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_change_direction);
       tv_monitor = findViewById(R.id.tv_monitor);
 }
   // 在配置项变更时触发。比如屏幕方向发生变更等等
   // 有的手机需要在系统的“设置→显示”菜单开启“自动旋转屏幕”,或者从顶部下拉,找到“自动旋转”图标并开启
   @Override
   public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       switch (newConfig.orientation) { // 判断当前的屏幕方向
           case Configuration.ORIENTATION_PORTRAIT: // 切换到竖屏
               mDesc = String.format("%s%s %s\n", mDesc,
                       DateUtil.getNowTime(), "当前屏幕为竖屏方向");
               tv_monitor.setText(mDesc);
               break;
           case Configuration.ORIENTATION_LANDSCAPE: // 切换到横屏
               mDesc = String.format("%s%s %s\n", mDesc,
                       DateUtil.getNowTime(), "当前屏幕为横屏方向");
               tv_monitor.setText(mDesc);
               break;
           default:
               break;
    }
 } 
}

3.只保持竖屏

如果希望App始终保持竖屏界面,即使手机旋转为横屏也不改变App的界面方向,可以修改 AndroidManifest.xml,给activity节点添加android:screenOrientation属性,并将该属性设置为portrait表示垂直方向,也就是保持竖屏界面;若该属性为landscape则表示水平方向,也就是保持横屏界面。修改后的activity节点示例如下:

<activity android:name=".ActTestActivity"
           android:screenOrientation="portrait"/>

landscape 为横屏

posted @ 2024-03-11 14:45  一个小笨蛋  阅读(26)  评论(0编辑  收藏  举报