精华内容
下载资源
问答
  • 讲解之前需要说明的是旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们...系统自动选择屏幕方向behind跟activity堆栈中的下面一个activity的方向一致landscape横方向,显示的宽比高长portrait竖方向,显示的高...

    讲解之前需要说明的是

    旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕

    手动设置屏幕:我们自己去调用Activity的 setRequestedOrientation 方法。

    设置屏幕的方向

    简介

    描述

    unspecified

    默认值。系统自动选择屏幕方向

    behind

    跟activity堆栈中的下面一个activity的方向一致

    landscape

    横屏方向,显示的宽比高长

    portrait

    竖屏方向,显示的高比宽长

    sensor

    由设备的物理方向传感器决定,如果用户旋转设备,这屏幕就会横竖屏切换

    nosensor

    忽略物理方向传感器,这样就不会随着用户旋转设备而横竖屏切换了("unspecified"设置除外)

    user

    用户当前首选的方向

    reverseLandscape

    API 9 以上,反向横屏

    reversePortrait

    API 9 以上,反向竖屏

    sensorLandscape

    API 9 以上,横屏,但是可以根据 物理方向传感器来切换正反向横屏

    sensorPortrait

    API 9 以上,竖屏,但是可以根据 物理方向传感器来切换正反向竖屏

    fullSensor

    API 9 以上,上下左右四个方向,由物理方向传感器决定

    locked

    API 18 以上,锁死当前屏幕的方向

    第一种

    我们可以在AndroidManifest 清单文件里面制定Activity的方向

    android:name=".view.main.MainActivity"

    android:screenOrientation="portrait">

    这样横竖屏切换的时候不会重新创建Activity

    第二种

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    Android:android:configChanges

    如果我们不配置configuration ,当 configuration 发生变化的时候,activity会自动处理它。反之,如果我们配置了相应的 configuration,当新的 configuration 发生变化的时候,会回调 Activity 的 onConfigurationChanged() 方法。

    下面我们一起来看一下几个常用的值得介绍,其他不常用的hi请自行查阅文档。官网地址:

    描述

    keyboardHidden

    键盘的可访问性发生变化——例如:用户发现了硬件键盘。

    orientation

    屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。

    screenLayout

    屏幕布局发生变化——这个会导致显示不同的Activity。屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。

    screenSize

    当前可用屏幕大小发生变化。这代表一个当前可用大小的变化,和当前的比率相关,因此当用户选择不同的画面和图像,会发生变化。然而,如果你的程序目标API级别是12或更低,你的Activity总是会自己处理这个配置变化(这个变化不会引起Activity的重启,甚至在Android 3.2或更新的设备上)。在API级别13里加入的。

    android:configChanges 常用配置

    在Android 3.2以后,如果我们进行下列的配置 ,这样的话横竖屏不会重新创建Activity,但是会调用 onConfigurationChanged()方法

    android:name=".view.main.MainActivity"

    android:configChanges="keyboardHidden|orientation|screenSize"

    >

    在api 3.2 以前,我们只需这样配置即可,android:configChanges="keyboardHidden|orientation"。

    android:name=".view.main.MainActivity"

    android:configChanges="keyboardHidden|orientation"

    >

    小结

    当我们进行了上述的配置,

    竖屏 》 横屏 onConfigurationChanged()方法会调用一次

    横屏 》 竖屏 onConfigurationChanged()方法也会调用一次

    因此我们通常可以进行相应的处理

    public void onConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

    if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

    // 加入横屏要处理的代码

    } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

    // 加入竖屏要处理的代码

    }

    }

    如果我们同时设置了 android:configChanges="keyboardHidden|orientation|screenSize" 和 android:screenOrientation="portrait",那又会是怎样的呢?

    如果我们打开系统的自动旋转屏幕,旋转屏幕,系统不会发生变化,也不会调用 Activity 的 onConfigurationChanged 方法。

    当我们手动调用 setRequestedOrientation() 方法去改变屏幕的方向的时候,还是会调用 onConfigurationChanged 方法的

    扩展

    设置全屏模式

    // 去掉ActionBar

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // 设置全屏

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    在实际项目中,我们通常会固定我们应用的屏幕方向,只对一些特定的需要切换屏幕的Activity做处理,那我们如何统一设置屏幕的方向呢?

    第一种方法,复制张贴,在AndroidManifest清单文件里面的每一个Activity标签增加如下标签。

    android:screenOrientation="portrait"

    >

    第二种方法,刚开始我直接在 AppTheme 里面 设置 android:screenOrientation,但是没有效果,刚开始我也很纳闷,后面查阅了官网文档,描述如下,才解决了疑问.

    Specify the orientation an activity should be run in. If not specified, it will run in the current preferred orientation of the screen. This attribute is supported by the element.

    portrait

    即这种方法不可取

    第三种方法,在BaseActivity里面动态设置

    public class BaseActivity extends AppCompatActivity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }

    }

    同时列出这三种方法,最主要的目的不是为了告诉大家有这几种方法可以统一设置屏幕的方向,最重要的是告诉大家一种思想吧。通常在xml 文件可以设置的,在java 代码也可以设置。

    利用系统的加载机制自动帮我们加载相应的布局

    如果大家在资源目录res 中添加了 layout-land(横向布局文件夹) 和 layout-port (竖想布局文件夹),重启Activity模式的横竖屏切换,

    可能有人会有这样的疑问,当我们设置了Activity的方向为竖屏或者横屏的时候,旋转屏幕并不会重新调用Activity的各个生命周期,那我们要怎样检测呢?

    其实很简单,那就是利用我们的传感器,然后根据旋转的方向做相应的处理

    //注册重力感应器 屏幕旋转

    mSm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

    mSensor = mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    mSm.registerListener(mOrientationSensorListener, mSensor, SensorManager.SENSOR_DELAY_UI);

    public class OrientationSensorListener implements SensorEventListener {

    private static final int _DATA_X = 0;

    private static final int _DATA_Y = 1;

    private static final int _DATA_Z = 2;

    public static final int ORIENTATION_UNKNOWN = -1;

    private boolean sensor_flag = true;

    public static final String TAG = "xujun";

    int mLastAngle=-1;

    AngleChangleListener mAngleChangleListener;

    public OrientationSensorListener(AngleChangleListener angleChangleListener){

    mAngleChangleListener=angleChangleListener;

    }

    @Override

    public void onAccuracyChanged(Sensor arg0, int arg1) {

    // TODO Auto-generated method stub

    }

    @Override

    public void onSensorChanged(SensorEvent event) {

    float[] values = event.values;

    int orientation = ORIENTATION_UNKNOWN;

    float X = -values[_DATA_X];

    float Y = -values[_DATA_Y];

    float Z = -values[_DATA_Z];

    /**

    * 这一段据说是 android源码里面拿出来的计算 屏幕旋转的 不懂 先留着 万一以后懂了呢

    */

    float magnitude = X * X + Y * Y;

    // Don't trust the angle if the magnitude is small compared to the y value

    if (magnitude * 4 >= Z * Z) {

    //屏幕旋转时

    float OneEightyOverPi = 57.29577957855f;

    float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi;

    orientation = 90 - (int) Math.round(angle);

    // normalize to 0 - 359 range

    while (orientation >= 360) {

    orientation -= 360;

    }

    while (orientation < 0) {

    orientation += 360;

    }

    }

    if (orientation > 225 && orientation < 315) { //横屏

    sensor_flag = false;

    } else if ((orientation > 315 && orientation < 360) || (orientation > 0 &&

    orientation < 45)) { //竖屏

    sensor_flag = true;

    }

    // Log.i(TAG, "onSensorChanged: orientation=" + orientation+" mLastAngle="+mLastAngle);

    if(mLastAngle!=orientation && mAngleChangleListener!=null){

    mAngleChangleListener.onChange(orientation);

    mLastAngle=orientation;

    }

    }

    }

    设备旋转时保存Activity的交互状态

    148f88a9dfa36fa93d6c1fc38985b53c.png

    大家先看一下Activity的生命周期,我们知道如果我们不配置Activity的方向或者Activity的 android:configchang 属性的时候,每次旋转屏幕,Activity都会重新被创建出来。那我们要如何保存我们当前的状态呢。

    其实我们可以考虑在 onPause() 或者在 onStop() 里面保存我们相应的数据,再在onCreate() 方法里面判断 savedInstanceState 是否有缓存我们的数据即可。 至于选择在onPause() 还是 onStop() 保存数据,得看具体的需求分析。 onPause() 在界面失去焦点的时候会回调, onStop() 方法在界面完全不可见的时候会回调。

    private static final String KEY_INDEX = "index";

    private int mCurrentIndex = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    if (savedInstanceState != null) {

    mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);

    }

    }

    @Override

    protected void onPause(Bundle outState) {

    super.onSaveInstanceState(outState);

    outState.putInt(KEY_INDEX, mCurrentIndex);

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • Activity横竖屏切换时的UI处理

    千次阅读 2011-06-17 21:26:00
    在Mainifest.xml的Activity元素中加入 android:screenOrientation="portrait"属性表示UI界面竖显示在Mainifest.xml的Activity元素中加入 android:screenOrientation="landscape"属性表示UI界面横显示在Mainifest...

    在Mainifest.xml的Activity元素中加入 android:screenOrientation="portrait"属性表示UI界面竖屏显示

    在Mainifest.xml的Activity元素中加入 android:screenOrientation="landscape"属性表示UI界面横屏显示

    在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性

            <activity android:name=".FileBrowser"
    
                      android:label="@string/app_name"
    
                      android:configChanges="orientation|keyboardHidden">
    
                <intent-filter>
    
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
    
                </intent-filter>
    
            </activity>

    声明这个属性,表示应用中会处理屏幕方向和键盘状态(推出或合上)信息的改动,并且需要在此Activity类中,重写onConfigurationChanged()方法:

    /**

    	 * onConfigurationChanged
    
    	 * the package:android.content.res.Configuration.
    
    	 * @param newConfig, The new device configuration.
    
    	 * 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
    
    	 * 并且如果此时有activity正在运行,系统会调用这个函数。
    
    	 * 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过
    
    	 * android:configChanges="xxxx"指定的配置类型的改动;
    
    	 * 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。
    
    	 */
    	@Override
    
    	public void onConfigurationChanged(Configuration newConfig) {	
    
    		super.onConfigurationChanged(newConfig);
    
    		// 检测屏幕的方向:纵向或横向
    
    		if (this.getResources().getConfiguration().orientation 
    
    				== Configuration.ORIENTATION_LANDSCAPE) {
    
    			//当前为横屏, 在此处添加额外的处理代码
    
    		}
    
    		else if (this.getResources().getConfiguration().orientation 
    
    				== Configuration.ORIENTATION_PORTRAIT) {
    
    			//当前为竖屏, 在此处添加额外的处理代码
    
    		}
    
    		//检测实体键盘的状态:推出或者合上    
    
    		if (newConfig.hardKeyboardHidden 
    
    				== Configuration.HARDKEYBOARDHIDDEN_NO){ 
    
    			//实体键盘处于推出状态,在此处添加额外的处理代码
    
    		} 
    
    		else if (newConfig.hardKeyboardHidden
    
    				== Configuration.HARDKEYBOARDHIDDEN_YES){ 
    
    			//实体键盘处于合上状态,在此处添加额外的处理代码
    
    		}
    
    	}
    展开全文
  • Activity横竖屏切换的那些事

    千次阅读 2017-03-15 19:40:24
    讲解之前需要说明的是 旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕 手动设置屏幕:我们自己去调用Activity的 setRequestedOrientation 方法。 设置屏幕的方向简介 值 ... 横方向

    讲解之前需要说明的是

    • 旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕
    • 手动设置屏幕:我们自己去调用Activity的 setRequestedOrientation 方法。

    设置屏幕的方向

    简介

    描述
    unspecified默认值。系统自动选择屏幕方向
    behind跟activity堆栈中的下面一个activity的方向一致
    landscape横屏方向,显示的宽比高长
    portrait竖屏方向,显示的高比宽长
    sensor由设备的物理方向传感器决定,如果用户旋转设备,这屏幕就会横竖屏切换
    nosensor忽略物理方向传感器,这样就不会随着用户旋转设备而横竖屏切换了(”unspecified”设置除外)
    user用户当前首选的方向
    reverseLandscapeAPI 9 以上,反向横屏
    reversePortraitAPI 9 以上,反向竖屏
    sensorLandscapeAPI 9 以上,横屏,但是可以根据 物理方向传感器来切换正反向横屏
    sensorPortraitAPI 9 以上,竖屏,但是可以根据 物理方向传感器来切换正反向竖屏
    fullSensorAPI 9 以上,上下左右四个方向,由物理方向传感器决定
    lockedAPI 18 以上,锁死当前屏幕的方向

    官网文档地址

    第一种

    我们可以在AndroidManifest 清单文件里面制定Activity的方向

    <activity
        android:name=".view.main.MainActivity"
    
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
    
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    这样横竖屏切换的时候不会重新创建Activity

    第二种

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    

    Android:android:configChanges

    如果我们不配置configuration ,当 configuration 发生变化的时候,activity会自动处理它。反之,如果我们配置了相应的 configuration,当新的 configuration 发生变化的时候,会回调 Activity 的 onConfigurationChanged() 方法。

    下面我们一起来看一下几个常用的值得介绍,其他不常用的hi请自行查阅文档。官网地址:

    描述
    keyboardHidden键盘的可访问性发生变化——例如:用户发现了硬件键盘。
    orientation屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。
    screenLayout屏幕布局发生变化——这个会导致显示不同的Activity。屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。
    screenSize当前可用屏幕大小发生变化。这代表一个当前可用大小的变化,和当前的比率相关,因此当用户选择不同的画面和图像,会发生变化。然而,如果你的程序目标API级别是12或更低,你的Activity总是会自己处理这个配置变化(这个变化不会引起Activity的重启,甚至在Android 3.2或更新的设备上)。在API级别13里加入的。

    android:configChanges 常用配置

    在Android 3.2以后,如果我们进行下列的配置 ,这样的话横竖屏不会重新创建Activity,但是会调用 onConfigurationChanged()方法

    <activity
        android:name=".view.main.MainActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
    
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    在api 3.2 以前,我们只需这样配置即可,android:configChanges=”keyboardHidden|orientation”。

    <activity
        android:name=".view.main.MainActivity"
        android:configChanges="keyboardHidden|orientation"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
    
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    小结

    当我们进行了上述的配置,

    • 竖屏 》 横屏 onConfigurationChanged()方法会调用一次

    • 横屏 》 竖屏 onConfigurationChanged()方法也会调用一次

    因此我们通常可以进行相应的处理

    public void onConfigurationChanged(Configuration newConfig) {  
    
        super.onConfigurationChanged(newConfig);  
    
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {  
            // 加入横屏要处理的代码  
        } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
            // 加入竖屏要处理的代码  
        }  
    }

    如果我们同时设置了 android:configChanges=”keyboardHidden|orientation|screenSize” 和 android:screenOrientation=”portrait”,那又会是怎样的呢?

    如果我们打开系统的自动旋转屏幕,旋转屏幕,系统不会发生变化,也不会调用 Activity 的 onConfigurationChanged 方法。

    当我们手动调用 setRequestedOrientation() 方法去改变屏幕的方向的时候,还是会调用 onConfigurationChanged 方法的


    扩展

    设置全屏模式

    // 去掉ActionBar
    requestWindowFeature(Window.FEATURE_NO_TITLE);  
    // 设置全屏
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    在实际项目中,我们通常会固定我们应用的屏幕方向,只对一些特定的需要切换屏幕的Activity做处理,那我们如何统一设置屏幕的方向呢?

    • 第一种方法,复制张贴,在AndroidManifest清单文件里面的每一个Activity标签增加如下标签。
    <activity android:name=".MainActivity"
              android:screenOrientation="portrait"
             >
    
    </activity>
    • 第二种方法,刚开始我直接在 AppTheme 里面 设置 android:screenOrientation,但是没有效果,刚开始我也很纳闷,后面查阅了官网文档,描述如下,才解决了疑问.

      Specify the orientation an activity should be run in. If not specified, it will run in the current preferred orientation of the screen. This attribute is supported by the element.

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:screenOrientation">portrait</item>
    </style>
    
    

    即这种方法不可取

    • 第三种方法,在BaseActivity里面动态设置
    public class BaseActivity extends AppCompatActivity {
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    
    }

    同时列出这三种方法,最主要的目的不是为了告诉大家有这几种方法可以统一设置屏幕的方向,最重要的是告诉大家一种思想吧。通常在xml 文件可以设置的,在java 代码也可以设置。

    利用系统的加载机制自动帮我们加载相应的布局

    如果大家在资源目录res 中添加了 layout-land(横向布局文件夹) 和 layout-port (竖想布局文件夹),重启Activity模式的横竖屏切换,

    可能有人会有这样的疑问,当我们设置了Activity的方向为竖屏或者横屏的时候,旋转屏幕并不会重新调用Activity的各个生命周期,那我们要怎样检测呢?

    其实很简单,那就是利用我们的传感器,然后根据旋转的方向做相应的处理

    //注册重力感应器  屏幕旋转
    mSm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSensor = mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSm.registerListener(mOrientationSensorListener, mSensor, SensorManager.SENSOR_DELAY_UI);
    public class OrientationSensorListener implements SensorEventListener {
        private static final int _DATA_X = 0;
        private static final int _DATA_Y = 1;
        private static final int _DATA_Z = 2;
    
        public static final int ORIENTATION_UNKNOWN = -1;
        private boolean sensor_flag = true;
    
        public static final String TAG = "xujun";
    
        int mLastAngle=-1;
        AngleChangleListener mAngleChangleListener;
    
        public OrientationSensorListener(AngleChangleListener angleChangleListener){
            mAngleChangleListener=angleChangleListener;
        }
    
        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
    
        @Override
        public void onSensorChanged(SensorEvent event) {
    
            float[] values = event.values;
    
            int orientation = ORIENTATION_UNKNOWN;
            float X = -values[_DATA_X];
            float Y = -values[_DATA_Y];
            float Z = -values[_DATA_Z];
    
            /**
             * 这一段据说是 android源码里面拿出来的计算 屏幕旋转的 不懂 先留着 万一以后懂了呢
             */
            float magnitude = X * X + Y * Y;
            // Don't trust the angle if the magnitude is small compared to the y value
            if (magnitude * 4 >= Z * Z) {
                //屏幕旋转时
                float OneEightyOverPi = 57.29577957855f;
                float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi;
                orientation = 90 - (int) Math.round(angle);
                // normalize to 0 - 359 range
                while (orientation >= 360) {
                    orientation -= 360;
                }
                while (orientation < 0) {
                    orientation += 360;
                }
            }
    
            if (orientation > 225 && orientation < 315) {  //横屏
                sensor_flag = false;
            } else if ((orientation > 315 && orientation < 360) || (orientation > 0 &&
                    orientation < 45)) {  //竖屏
                sensor_flag = true;
            }
    //        Log.i(TAG, "onSensorChanged: orientation=" + orientation+"   mLastAngle="+mLastAngle);
            if(mLastAngle!=orientation && mAngleChangleListener!=null){
                mAngleChangleListener.onChange(orientation);
                mLastAngle=orientation;
            }
    
        }
    }

    设备旋转时保存Activity的交互状态

    大家先看一下Activity的生命周期,我们知道如果我们不配置Activity的方向或者Activity的 android:configchang 属性的时候,每次旋转屏幕,Activity都会重新被创建出来。那我们要如何保存我们当前的状态呢。

    其实我们可以考虑在 onPause() 或者在 onStop() 里面保存我们相应的数据,再在onCreate() 方法里面判断 savedInstanceState 是否有缓存我们的数据即可。 至于选择在onPause() 还是 onStop() 保存数据,得看具体的需求分析。 onPause() 在界面失去焦点的时候会回调, onStop() 方法在界面完全不可见的时候会回调。

    private static final String KEY_INDEX = "index";
    private int mCurrentIndex = 0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
        }
    }
    
    @Override
    protected void onPause(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(KEY_INDEX, mCurrentIndex);
    }

    Activity横竖屏切换的那些事

    Demo 下载地址

    展开全文
  • 起因:有一个需求,竖屏Activity A跳到横屏Activity B,B操作结束后finish然后返回A,A上面重建了,之前的操作比如listview添加了item都没有了 测试条件:红米Note2一部,华为一部 测试:1.华为测试机  打日志...

    起因:有一个需求,竖屏Activity A跳到横屏Activity B,B操作结束后finish然后返回A,A上面重建了,之前的操作比如listview添加了item都没有了

    测试条件:红米Note2一部,华为一部

    测试:1.华为测试机

                    打日志发现,A跳到B时,A执行了一次onCreate,B操作结束后finish然后返回A,A又执行了一次onCreate,这就是为什么A的界面被重建了。

                    为了阻止A反复执行onCreate,一般的做法是

    首先要在配置Activity的时候进行如下的配置:
    
    <activity android:name=".MyActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    
    另外需要重写Activity的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏
            //你要执行的操作,可以不写
    
       } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){//竖屏
            //<span style="font-family: Arial, Helvetica, sans-serif;">你要执行的操作,可以不写</span>
    
        }
    }

                这样写的目的是阻止Activity横竖屏切换时调用生命周期,比如onCreate

                但是经过我自己的尝试,发现并没有监听到onConfigurationChanged方法,后来发现一个外国友人的解释

    Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the "screenSize" value in addition to the "orientation" value. That is, you must decalare android:configChanges="orientation|screenSize". However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).

             大体意思是:

             注意:在Android 3.2(API Level 13)开始,“screen size” 同时变化时的肖像和风景 取向之间的切换。因此,如果你想防止运行时重新启动,由于 方向改变时,开发API级别13或更高(如 宣布minSdkVersion和targetSdkVersion属性),你 必须包括“screen size的价值除了“定位” 价值。那就是,你必须decalare Android:configchanges =“orientation|screenSize”。然而,如果你的 应用目标API级别12或更低,那么你的活动总是 处理这种结构的变化本身(这种结构的变化 不重启你的活动,甚至在Android 3.2或更高的 装置运行时)。

     

             其实就是Android 3.2(API Level 13)开始,

    android:configChanges="orientation|keyboardHidden"
        这句改成
    <pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'宋体';font-size:9.0pt;"><span style="color:#9876aa;">android</span><span style="color:#bababa;">:configChanges=</span><span style="color:#a5c261;">"orientation|screenSize|keyboardHidden"</span>
    要多加一个

    screenSize
     
    

              基本上这样就能阻止onCreate执行了,有兴趣的可以自己打日志看一下


        2.红米手机

        发现并没有出现这个问题,打了日志发现,红米手机里运行,A尽然没有切换横竖屏,这就是为什么没有问题的原因


    总结,适配果然是一门大学问,一山还比一山高

                

    展开全文
  • android 视频播放 点击横竖屏切换 自动旋转横竖屏切换 冲突
  • 最近用到了视频组件,需要设置...在AndroidManifest.xml中静态声明设置Activity的方向参数:android:screenOrientation="portrait" //设置竖 android:screenOrientation="landscape"//横 android:screenOrientation=
  • 这两天学习关于android横竖屏切换,遇到了些问题 1.为什么没有在清单文件中设置了android:configChanged属性,即在横竖屏切换的时候会销毁重建活动,但是View(如EditText)还会保持切换之前的状态? 因为Android...
  • Android 横竖屏切换

    2016-03-02 19:26:46
    上述设置更改的是整个手机的横竖屏切换,当手机没有关闭横竖屏切换功能时,系统一旦触发横竖屏切换,缺省状态下,当前活动的App的界面就会进行横竖屏切换,由于横竖屏的界面尺寸等参数不同,很多软件在设计和开发中...
  • 默认情况下,横竖屏切换时,应用会被失去焦点,UI不可见,应用销毁,然后重新创建应用,ui可见,获取焦点。这时在一些应用中就会出现问题,比如打游戏时,boss快被干死了,突然间,横竖屏切换了,boss又满血满蓝原地...
  • Android横竖屏切换时不销毁Activity

    千次阅读 2016-05-13 16:08:00
    横竖屏切换不关闭activity,设置了android:configChanges="orientation|keyboardHidden";为什么还会走生命周期过程
  • Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕...
  • Android横竖屏切换小结

    2015-11-18 11:09:27
    Android手机或平板都会存在横竖屏切换的功能,通常是由物理重力感应触发的,但是有时候也不尽然,通常在设置里面我们可以对手机的横竖屏切换进行关闭,操作界面如下   只需要点击下“屏幕旋转”按钮就可以关闭...
  • Android开发横竖屏切换

    2017-03-20 16:15:25
    平时在使用手机过程中遇到过手机屏幕横竖切换的现象,当时...我们的手机系统内置了横竖屏切换的功能,当我们没有关闭此功能时,系统一旦触发横竖屏切换,在缺省值的情况下,当前活动的APP界面就会进行相应的横竖屏切
  • 在编写android小应用的时候,碰到了这样的一个问题:当推开手机的实体键盘时,屏幕由竖转换为横,此时应用程序的显示界面(Activity)就会被销毁了,这个让人比较郁闷。如何才能让这个activity不被销毁呢?-------...
  • dialog横竖屏切换不适配

    千次阅读 2016-05-03 17:50:19
    dialog横竖屏切换不适配 ...因为横竖屏切换会重新走activity的生命周期,所以可以在创建一个类继承activityprivate void modifyDialogStyle() { getWindow().setLayout( WindowManager.LayoutParams
  • 根据锁定横竖屏快捷键状态进行横竖屏切换,以及播放时进行对横竖屏快捷键状态变更时进行手动和自动横竖屏切换,以及锁屏 一,首先监听横竖屏快捷键状态,其中自动旋转为1,锁定方向为0 /** * 自动横竖屏切换按钮...
  • android开发的时候通常会使用到横竖屏切换,但是有些图片在横竖屏切换的时候十分丑陋,这里我就给大家实现一个简单的方法能够实现横竖屏的切换。   重写activity 的onConfigurationChanged 方法 @Override ...
  • android横竖屏切换

    2015-04-30 14:06:00
    上述设置更改的是整个手机的横竖屏切换,当手机没有关闭横竖屏切换功能时,系统一旦触发横竖屏切换,缺省状态下,当前活 动的App的界面就会进行横竖屏切换,由于横竖屏的界面尺寸等参数不同,很多软件在设计和开发中...
  • Android 横竖屏切换问题

    千次阅读 2018-09-20 14:12:23
    App 横竖屏切换的时候会销毁当前的 Activity 然后重新创建一个 横竖屏切换Activity 生命周期:onPause-&gt; onStop-&gt; onDestory-&gt; onCreate-&gt;onStart-&gt;onResume 现在设置一个...
  • 1、新建一个Activity,并把各个生命周期打印出来 onCreate, 创建activity时调用。设置在该方法中,还以Bundle中可以提出用于创建该 Activity 所需的信息。onStart, activity变为在屏幕上对用户可见时,即获得焦点时...
  • 1. 生命周期流程 & 方法详解 1.1 具体请看下图 1.2 注意点 a. 生命周期方法 = 成对出现(配对) onCreate() & onDestory() onStart() & onStop() onResume() &...b.... onStop() :从 Act
  • Android 横竖屏切换小结(实践)

    千次阅读 2018-02-01 16:20:59
    Android 横竖屏切换小结(实践) 首先我们先创建一个Activity 名为Main2Activity 写出相应的Activity 的生命周期,并且在Androidmanifest.xm中什么都没有配置如下: activity android:name=".land_portrait.Main...
  • 横竖屏切换设置不刷新UI

    千次阅读 2013-03-20 17:46:46
    自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载...
  • 目前一般情况下 在横竖屏情况下 我们会遇到一些问题 例如横竖屏显示ui 比例问题 还有activity重启问题 今天说三个问题 一是横竖屏切换 二是 禁止屏幕旋转说一下屏幕切换时 的activity 生命周期onPause()—->...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,157
精华内容 2,062
关键字:

activityui横竖屏切换