屏幕方向 横竖屏切换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屏幕方向 横竖屏切换相关的知识,希望对你有一定的参考价值。


屏幕方向的控制

屏幕方向是对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设置相同的策略来旋转屏幕的方向。 
技术分享


横竖屏切换时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_LANDSCAPEtv.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>  







































以上是关于屏幕方向 横竖屏切换的主要内容,如果未能解决你的问题,请参考以下文章

Activity横竖屏切换

Android 切换横竖屏

【iOS】Swift4.0 横竖屏监测、动态切换

Android 丨 个别机型横竖屏切换崩溃

禁止横竖屏切换强制横竖屏:

android 横竖屏切换不重走生命周期