屏幕方向的控制
屏幕方向是对Activity而言的,你可以在AndroidManifest.xml 文件中,通过activity的android:screenOrientation属性进行设定。在此配置的值会反映在Activity的getRequestedOrientation()方法的返回值中,与之对应的setRequestedOrientation()方法可以动态改变该属性的值。
另外, 还可以通过Configuration对象来取得Activity当前的显示方向
取值:
- unspecified 默认值,由系统来选择方向。
- user 使用用户当前首选的方向。
- behind 使用Activity堆栈中与该Activity之下的那个Activity的相同的方向。
- landscape 横向显示,宽度比高度要大,一般游戏采用这个
- portrait 纵向显示,高度比宽度要大,基本上都是这个
- reverseLandscape 与正常的横向方向相反显示,在API Level 9中被引入。
- reversePortrait 与正常的纵向方向相反显示,在API Level 9中被引入。
- sensorLandscape 横向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
- sensorPortrait 纵向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
- sensor 显示的方向是由设备的方向传感器来决定的。显示方向依赖与用户怎样持有设备;当用户旋转设备时,显示的方向会改变。但是,默认情况下,有些设备不会在所有的四个方向上都旋转,因此要允许在所有的四个方向上都能旋转,就要使用fullSensor属性值。
- fullSensor 显示的方向(4个方向)是由设备的方向传感器来决定的,除了它允许屏幕有4个显示方向之外,其他与设置为sensor时情况类似,不管什么样的设备,通常都会这么做。例如,某些设备通常不使用纵向倒转或横向反转,但是使用这个设置,还是会发生这样的反转。这个值在API Level 9中引入。
- nosensor 屏幕的显示方向不会参照物理方向传感器。传感器会被忽略,所以显示不会因用户移动设备而旋转。除了这个差别之外,系统会使用与unspecified设置相同的策略来旋转屏幕的方向。
android:screenOrientation属性详见:http://www.android-doc.com/guide/topics/manifest/activity-element.html
横竖屏切换时Activity生命周期的控制
包青天实测:
1、什么都不设置
每次都会,且只会,调用oncreate方法
2、设置android:configChanges="keyboardHidden|orientation|screenSize"每次都会,且只会,调用onConfigurationChanged方法
3、设置android:configChanges="orientation"
- 竖-横:先调用onConfigurationChanged接着调用oncreate
- 横-竖:只调用onConfigurationChanged
注意:
在设置Activity的android:configChanges="orientation|keyboardHidden"后,横竖屏还是一样会重新调用各个生命周期的方法,因为screen size也跟着设备的横竖切换在改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation", 你还必须设置"ScreenSize"。
android:configChanges属性详见:http://www.android-doc.com/guide/topics/manifest/activity-element.html
测试代码
public class MainActivity extends Activity {
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.tv);
Log.i("bqt", "++++++我是onCreate方法");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("bqt", "++++++我是onConfigurationChanged方法");
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) tv.setText("横屏");
else tv.setText("竖屏");//这个地方可能执行不到
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="横竖屏切换测试"
android:textSize="14sp" />
<EditText
android:id="@+id/et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="不设置id时横竖屏切换不会保存输入的内容"
android:textSize="14sp" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="我就没有设置id"
android:textSize="14sp" />
</LinearLayout>