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方法重新设定显示方式。故而只要给该属性指定若干豁免情况,就能避免无谓的页面重启操作了,配置变更豁免情况的取值说明见表
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 为横屏
本文来自博客园,作者:一个小笨蛋,转载请注明原文链接:https://www.cnblogs.com/paylove/p/18066066