精华内容
下载资源
问答
  • 旋转屏幕重新加载Activity

    千次阅读 2012-11-01 18:10:09
    在启动一个acitivity之后,旋转一下屏幕(从竖屏模式切换到横屏模式,或者反过来),尤其是带有侧滑键盘的机型打开滑动键盘时,如果屏幕为竖屏模式,则屏幕会被强制切换到横屏模式。当屏幕显示模式发生变化时,由于...
     在启动一个acitivity之后,旋转一下屏幕(从竖屏模式切换到横屏模式,或者反过来),尤其是带有侧滑键盘的机型打开滑动键盘时,如果屏幕为竖屏模式,则屏幕会被强制切换到横屏模式。当屏幕显示模式发生变化时,由于横竖屏显示模式存在一些明显的区别,Android系统会认为当前activity显示内容已经不再适合新的屏幕显示模式,所以它会重新加载当前的activity,选择合适的资源以适应新的屏幕显示模式。下面通过一个简单的例子跟踪Acitivity生命周期的变化。

            新建一个工程,包含两个Activity分别为DemoParentActivity和DemoChildActivity,在第一个Activity中添加一个可以跳转到第二个Activity的按钮,并分别实现它们的生命周期函数,在函数里面打印一些日志信息,观察Activity生命周期函数调用情况。

            ActivityTestActivity.class的代码:
    01	package com.devdiv.test.activitytest;
    02	 
    03	 
    04	import android.app.Activity;
    05	import android.content.Intent;
    06	import android.content.res.Configuration;
    07	import android.os.Bundle;
    08	import android.util.Log;
    09	import android.view.View;
    10	 
    11	public class ActivityTestActivity extends Activity {
    12	    /** Called when the activity is first created. */
    13	    @Override
    14	    public void onCreate(Bundle savedInstanceState) {
    15	        super.onCreate(savedInstanceState);
    16	        setContentView(R.layout.main);
    17	         
    18	         
    19	        if (savedInstanceState == null) {
    20	                Log.d("test", "ActivityTestActivity - onCreate()");
    21	                } else {
    22	                        Log.d("test","ActivityTestActivity - onCreate() with a supplied savedInstanceState");
    23	                }
    24	    }
    25	 
    26	        @Override
    27	        public void onConfigurationChanged(Configuration newConfig) {
    28	                // TODO Auto-generated method stub
    29	                super.onConfigurationChanged(newConfig);
    30	                Log.d("test", "ActivityTestActivity - onConfigurationChanged()");
    31	        }
    32	 
    33	        @Override
    34	        protected void onDestroy() {
    35	                // TODO Auto-generated method stub
    36	                super.onDestroy();
    37	                Log.d("test", "ActivityTestActivity - onDestroy()");
    38	        }
    39	 
    40	        @Override
    41	        protected void onPause() {
    42	                // TODO Auto-generated method stub
    43	                super.onPause();
    44	                Log.d("test", "ActivityTestActivity - onPause()");
    45	        }
    46	 
    47	        @Override
    48	        protected void onRestart() {
    49	                // TODO Auto-generated method stub
    50	                super.onRestart();
    51	                Log.d("test", "ActivityTestActivity - onRestart()");
    52	        }
    53	 
    54	        @Override
    55	        protected void onRestoreInstanceState(Bundle savedInstanceState) {
    56	                // TODO Auto-generated method stub
    57	                super.onRestoreInstanceState(savedInstanceState);
    58	                Log.d("test", "ActivityTestActivity - onRestoreInstanceState()");
    59	        }
    60	 
    61	        @Override
    62	        protected void onResume() {
    63	                // TODO Auto-generated method stub
    64	                super.onResume();
    65	                Log.d("test", "ActivityTestActivity - onResume()");
    66	        }
    67	 
    68	        @Override
    69	        protected void onSaveInstanceState(Bundle outState) {
    70	                // TODO Auto-generated method stub
    71	                super.onSaveInstanceState(outState);
    72	                Log.d("test", "ActivityTestActivity - onSaveInstanceState()");
    73	        }
    74	 
    75	        @Override
    76	        protected void onStart() {
    77	                // TODO Auto-generated method stub
    78	                super.onStart();
    79	                Log.d("test", "ActivityTestActivity - onStart()");
    80	        }
    81	 
    82	        @Override
    83	        protected void onStop() {
    84	                // TODO Auto-generated method stub
    85	                super.onStop();
    86	                Log.d("test", "ActivityTestActivity - onStop()");
    87	        }
    88	         
    89	        public void onButtonClick(View v) {
    90	                Intent mIntent = new Intent(this, SecondActivity.class);
    91	                startActivity(mIntent);
    92	        }
    93	     
    94	     
    95	}

    SecondActivity.class的代码:

    01	package com.devdiv.test.activitytest;
    02	 
    03	 
    04	import android.app.Activity;
    05	import android.content.Intent;
    06	import android.content.res.Configuration;
    07	import android.os.Bundle;
    08	import android.util.Log;
    09	import android.view.View;
    10	 
    11	public class ActivityTestActivity extends Activity {
    12	    /** Called when the activity is first created. */
    13	    @Override
    14	    public void onCreate(Bundle savedInstanceState) {
    15	        super.onCreate(savedInstanceState);
    16	        setContentView(R.layout.main);
    17	         
    18	         
    19	        if (savedInstanceState == null) {
    20	                Log.d("test", "ActivityTestActivity - onCreate()");
    21	                } else {
    22	                        Log.d("test","ActivityTestActivity - onCreate() with a supplied savedInstanceState");
    23	                }
    24	    }
    25	 
    26	        @Override
    27	        public void onConfigurationChanged(Configuration newConfig) {
    28	                // TODO Auto-generated method stub
    29	                super.onConfigurationChanged(newConfig);
    30	                Log.d("test", "ActivityTestActivity - onConfigurationChanged()");
    31	        }
    32	 
    33	        @Override
    34	        protected void onDestroy() {
    35	                // TODO Auto-generated method stub
    36	                super.onDestroy();
    37	                Log.d("test", "ActivityTestActivity - onDestroy()");
    38	        }
    39	 
    40	        @Override
    41	        protected void onPause() {
    42	                // TODO Auto-generated method stub
    43	                super.onPause();
    44	                Log.d("test", "ActivityTestActivity - onPause()");
    45	        }
    46	 
    47	        @Override
    48	        protected void onRestart() {
    49	                // TODO Auto-generated method stub
    50	                super.onRestart();
    51	                Log.d("test", "ActivityTestActivity - onRestart()");
    52	        }
    53	 
    54	        @Override
    55	        protected void onRestoreInstanceState(Bundle savedInstanceState) {
    56	                // TODO Auto-generated method stub
    57	                super.onRestoreInstanceState(savedInstanceState);
    58	                Log.d("test", "ActivityTestActivity - onRestoreInstanceState()");
    59	        }
    60	 
    61	        @Override
    62	        protected void onResume() {
    63	                // TODO Auto-generated method stub
    64	                super.onResume();
    65	                Log.d("test", "ActivityTestActivity - onResume()");
    66	        }
    67	 
    68	        @Override
    69	        protected void onSaveInstanceState(Bundle outState) {
    70	                // TODO Auto-generated method stub
    71	                super.onSaveInstanceState(outState);
    72	                Log.d("test", "ActivityTestActivity - onSaveInstanceState()");
    73	        }
    74	 
    75	        @Override
    76	        protected void onStart() {
    77	                // TODO Auto-generated method stub
    78	                super.onStart();
    79	                Log.d("test", "ActivityTestActivity - onStart()");
    80	        }
    81	 
    82	        @Override
    83	        protected void onStop() {
    84	                // TODO Auto-generated method stub
    85	                super.onStop();
    86	                Log.d("test", "ActivityTestActivity - onStop()");
    87	        }
    88	         
    89	        public void onButtonClick(View v) {
    90	                Intent mIntent = new Intent(this, SecondActivity.class);
    91	                startActivity(mIntent);
    92	        }
    93	     
    94	     
    95	}
    
    
    
            SecondActivity.class的代码:
    
    01	package com.devdiv.test.activitytest;
    02	 
    03	import android.app.Activity;
    04	import android.content.res.Configuration;
    05	import android.os.Bundle;
    06	import android.util.Log;
    07	 
    08	public class SecondActivity extends Activity {
    09	         
    10	        /** Called when the activity is first created. */
    11	    @Override
    12	    public void onCreate(Bundle savedInstanceState) {
    13	        super.onCreate(savedInstanceState);
    14	        setContentView(R.layout.second);
    15	         
    16	         
    17	        if (savedInstanceState == null) {
    18	                Log.d("test", "SecondActivity - onCreate()");
    19	                } else {
    20	                        Log.d("test","SecondActivity - onCreate() with a supplied savedInstanceState");
    21	                }
    22	    }
    23	 
    24	        @Override
    25	        public void onConfigurationChanged(Configuration newConfig) {
    26	                // TODO Auto-generated method stub
    27	                super.onConfigurationChanged(newConfig);
    28	                Log.d("test", "SecondActivity - onConfigurationChanged()");
    29	        }
    30	 
    31	        @Override
    32	        protected void onDestroy() {
    33	                // TODO Auto-generated method stub
    34	                super.onDestroy();
    35	                Log.d("test", "SecondActivity - onDestroy()");
    36	        }
    37	 
    38	        @Override
    39	        protected void onPause() {
    40	                // TODO Auto-generated method stub
    41	                super.onPause();
    42	                Log.d("test", "SecondActivity - onPause()");
    43	        }
    44	 
    45	        @Override
    46	        protected void onRestart() {
    47	                // TODO Auto-generated method stub
    48	                super.onRestart();
    49	                Log.d("test", "SecondActivity - onRestart()");
    50	        }
    51	 
    52	        @Override
    53	        protected void onRestoreInstanceState(Bundle savedInstanceState) {
    54	                // TODO Auto-generated method stub
    55	                super.onRestoreInstanceState(savedInstanceState);
    56	                Log.d("test", "SecondActivity - onRestoreInstanceState()");
    57	        }
    58	 
    59	        @Override
    60	        protected void onResume() {
    61	                // TODO Auto-generated method stub
    62	                super.onResume();
    63	                Log.d("test", "SecondActivity - onResume()");
    64	        }
    65	 
    66	        @Override
    67	        protected void onSaveInstanceState(Bundle outState) {
    68	                // TODO Auto-generated method stub
    69	                super.onSaveInstanceState(outState);
    70	                Log.d("test", "SecondActivity - onSaveInstanceState()");
    71	        }
    72	 
    73	        @Override
    74	        protected void onStart() {
    75	                // TODO Auto-generated method stub
    76	                super.onStart();
    77	                Log.d("test", "SecondActivity - onStart()");
    78	        }
    79	 
    80	        @Override
    81	        protected void onStop() {
    82	                // TODO Auto-generated method stub
    83	                super.onStop();
    84	                Log.d("test", "SecondActivity - onStop()");
    85	        }
    86	         
    87	 
    88	}

     完成了工程代码之后,在eclipse中直接运行工程启动ActivityTestActivity,然后旋转手机(模拟器可以通过CTR+F11组合键进行横竖屏切换),可以从下图打印的日志中看到,当旋转手机屏幕后,DemoParentActivity被销毁后,又被重新加载了一次,同时还可以看到Activity的onSaveInstanceState和onRestoreInstanceState方法也被调用了,这就说明需要在切换屏幕显示模式时,通过这两个方法保存和恢复临时数据。

                                                            图1  模拟器LogCat日志信息
            某些情况下,并不希望在旋转屏幕时Activity被重新加载,这时可以通过修改Android应用工程的Androidmanifest.xml文件中Activity节点的android:configChanges属性,通常需要把这个属性设置为android:configChanges="orientation|navigation|keyboardHidden",这表示当屏幕旋转,页面转换以及键盘隐藏时都不要重新加载Activity,而是调用onConfigurationChanged方法。在上面的代码中可以看到SecondActivity覆盖了Activity的onConfigurationChanged方法,并设置了activity的android:configChanges属性。

            接下来点击按钮来启动SecondActivity,然后旋转屏幕再看一下输出的日志信息,从图2-11中可以清楚的看到,当切换屏幕显示模式时,SecondActivity并没有被重新加载,只是调用了它的onConfigurationChanged()方法,如果并不希望在旋转屏幕时Activity被重新加载,那么需要实现Activity的onConfigurationChanged方法进行添加相应的的处理逻辑。


    图2  模拟器LogCat日志信息



            旋转手机屏幕只会造成当前Activity的重新加载,并不会重新加载整个应用程序。现在有一个问题需要作进一步的分析,就是在旋转手机屏幕后,会不会影响Activity栈中其他的activity。在上面应用程序中,当旋转手机屏幕时,SecondActivity的onConfigurationChanged方法被调用,此时可以进行以下两种不同的操作:

            1、通过返回键,返回到ActivityTestActivity
            2、再次旋转屏幕之后,通过返回键,返回到ActivityTestActivity

            读者可以自行通过查看日志的方式验证,不再赘述。
            ActivityTest工程:DEMO

    展开全文
  • Android 旋转屏幕时禁止Activity重建

    千次阅读 2014-01-27 22:17:21
    在Android开发中,如果某些事件触发(例如:旋屏事件),则Activity会重新调用onCreate方法,对Activity重新初始化,这样不仅效率低,而且会造成数据丢失,解决办法是重写onConfigurationChanged方法,并在...

      在Android开发中,如果某些事件触发例如:旋屏事件),则Activity会重新调用onCreate方法,对Activity重新初始化,这样不仅效率低,而且会造成数据丢失,解决办法是重写onConfigurationChanged方法,并在AndroidManifest.xml中对Activity声明configChanges,这样特定事件触发就会调用onConfigurationChanged方法,而不是onCreate方法重新初始化。


      通常在AndroidManifest.xml中指定Activity添加以下代码:

    android:configChanges="orientation|keyboard|keyboardHidden"
      这句代码表示,当设备旋转、显示键盘、隐藏键盘时调用Activity的onConfigurationChanged方法,如果这句话不声明,特定事件触发的时候则会调用onCreate方法。


      下面是一个Demo,测试旋屏的时候数据的变化,用data模拟数据。

    public class MainActivity extends Activity {
    
    	private static final String TAG = "TEST";
    			
    	private int data;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		Log.i(TAG, "onCreate");
    		
    	}
    
    	@Override
    	protected void onStart() {
    		// TODO Auto-generated method stub
    		super.onStart();
    		data = (int) (Math.random() * 100);
    		Log.i(TAG, "onStart : " + data);
    	}
    	
    	@Override
    	public void onConfigurationChanged(Configuration newConfig) {
    		// TODO Auto-generated method stub
    		super.onConfigurationChanged(newConfig);
    		Log.i(TAG, "onConfigurationChanged : " + data);
    	}
    
    }


      旋屏三次效果:


      可见旋屏三次都没有进入onCreate方法,数据得以保留。

      另外需要注意的是onConfigurationChanged()方法中的:super.onConfigurationChanged(newConfig);一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。

    展开全文
  • 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,表现为卡顿或者黑屏一段时间。如果是在横竖屏...
  • Android实现屏幕旋转

    2016-10-13 13:59:46
    默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,表现为卡顿或者黑屏一段时间。如果是在横竖

    本文实例总结了Android实现屏幕旋转方法。分享给大家供大家参考。具体如下:

    在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:

    默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。

    了解了这些以后,我们对android的屏幕旋转方法进行如下总结:

    1. AndroidManifest.xml设置

    如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

    android:screenOrientation="landscape"横屏设置;
    android:screenOrientation="portrait"竖屏设置;

    这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。

    缺点:屏幕只有一个方向。

    2. 代码动态设置

    如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    //横屏设置
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    //竖屏设置
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    //默认设置

    这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;

    缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

    3. 重写onConfigurationChanged

    如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:

    首先,在AndroidMainfest.xml中添加configChanges:

    <activity android:name=".Test"
     android:configChanges="orientation|keyboard">
    </activity>

    注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;

    android:configChanges="keyboardHidden|orientation|screenSize"

    然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:

    public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);
    if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
    // Nothing need to be done here 
    } else { 
    // Nothing need to be done here 
     } 
    }

    这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
    缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

    4. 结合OrientationEventListener,自定义旋转监听设置

    如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:

    首先,创建OrientationEventListener对象:

    private OrientationEventListener mOrientationListener;
    // screen orientation listener
    private boolean mScreenProtrait = true;
    private boolean mCurrentOrient = false;

    然后,自定义屏幕变化回调接口

    abstract protected void OrientationChanged(int orientation);
    //screen orientation change event

    最后,自定义监听类

    private final void startOrientationChangeListener() {
     mOrientationListener = new OrientationEventListener(this) {
     @Override
     public void onOrientationChanged(int rotation) {
     if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation>=135)&&(rotation<=225))) {//portrait
     mCurrentOrient = true;
     if(mCurrentOrient!=mScreenProtrait)
     {
     mScreenProtrait = mCurrentOrient;
     OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     Log.d(TAG, "Screen orientation changed from Landscape to Portrait!");
     }
     }
     else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))) {//landscape
     mCurrentOrient = false;
     if(mCurrentOrient!=mScreenProtrait)
     {
     mScreenProtrait = mCurrentOrient;
     OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     Log.d(TAG, "Screen orientation changed from Portrait to Landscape!");
     }
     }
     }
     };
     mOrientationListener.enable();
    }

    在onCreate()中调用:

    startOrientationChangeListener();

    这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;

    注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。

    希望本文所述对大家的Android程序设计有所帮助。

    展开全文
  • Android实现屏幕旋转方法

    千次阅读 2016-11-24 20:20:58
    默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,表现为卡顿或者黑屏一段时间。如果是在横竖

    本文实例总结了Android实现屏幕旋转方法。分享给大家供大家参考。具体如下:

    在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:

    默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。

    了解了这些以后,我们对android的屏幕旋转方法进行如下总结:

    1. AndroidManifest.xml设置

    如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

    ?
    1
    2
    android:screenOrientation="landscape"横屏设置;
    android:screenOrientation="portrait"竖屏设置;

    这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。

    缺点:屏幕只有一个方向。

    2. 代码动态设置

    如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

    ?
    1
    2
    3
    4
    5
    6
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    //横屏设置
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    //竖屏设置
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    //默认设置

    这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;

    缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

    3. 重写onConfigurationChanged

    如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:

    首先,在AndroidMainfest.xml中添加configChanges:

    ?
    1
    2
    3
    <activity android:name=".Test"
     android:configChanges="orientation|keyboard">
    </activity>

    注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;

    ?
    1
    android:configChanges="keyboardHidden|orientation|screenSize"

    然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);
    if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
    // Nothing need to be done here
    } else {
    // Nothing need to be done here
     }
    }

    这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
    缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

    4. 结合OrientationEventListener,自定义旋转监听设置

    如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:
     
    首先,创建OrientationEventListener对象:

    ?
    1
    2
    3
    4
    private OrientationEventListener mOrientationListener;
    // screen orientation listener
    private boolean mScreenProtrait = true;
    private boolean mCurrentOrient = false;

    然后,自定义屏幕变化回调接口

    ?
    1
    2
    abstract protected void OrientationChanged(int orientation);
    //screen orientation change event

    最后,自定义监听类

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private final void startOrientationChangeListener() {
     mOrientationListener = new OrientationEventListener(this) {
     @Override
     public void onOrientationChanged(int rotation) {
     if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation>=135)&&(rotation<=225))) {//portrait
     mCurrentOrient = true;
     if(mCurrentOrient!=mScreenProtrait)
     {
     mScreenProtrait = mCurrentOrient;
     OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     Log.d(TAG, "Screen orientation changed from Landscape to Portrait!");
     }
     }
     else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))) {//landscape
     mCurrentOrient = false;
     if(mCurrentOrient!=mScreenProtrait)
     {
     mScreenProtrait = mCurrentOrient;
     OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     Log.d(TAG, "Screen orientation changed from Portrait to Landscape!");
     }
     }
     }
     };
     mOrientationListener.enable();
    }

    在onCreate()中调用:

    ?
    1
    startOrientationChangeListener();

    这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;

    注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。

    希望本文所述对大家的Android程序设计有所帮助。

    展开全文
  • Android中屏幕旋转全解

    2016-04-11 16:48:11
    默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,表现为卡顿或者黑屏一段时间。如果是在横竖屏...
  • 禁止屏幕旋转 在AndroidManifest.xml文件中,假如是MainActivity.java,添加android:screenOrientation,如果是想固定在垂直添加portrait,如果想固定在水平添加landscape <activity android:name="....
  • android 屏幕旋转问题

    2019-03-05 14:53:35
    屏幕旋转会有什么问题? 假如activity没有配置什么属性,当前界面会被销毁重新创建,走onPause()-onStop()-onDestory()-onCreate()-onStart()-onResume(), 会重新初始化全局变量,比如说。我们用一个clickCount ...
  • 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,表现为卡顿或者黑屏一段时间。如果是在横...
  • 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,表现为卡顿或者黑屏一段时间。如果是在横竖屏...
  • Android屏幕旋转使用

    2018-01-03 13:57:01
    在自己的资源下创建layout-land和layout-port横竖屏布局,activity_main.xml的布局文件名要一样,如在layout文件夹也有同一个activity_main.xml布局文件,它们的执行顺序是先从land/port文件夹索引,如果没有创建...
  • 1. 不做任何处理的情况下如果没有针对性地做任何处理的话,默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致app的当前activity发生onDestroy-> onCreate,会重新构造当前activity和界面布局,很...
  • android 手机屏幕旋转机制与使用说明

    千次阅读 2015-01-07 11:03:09
    屏幕旋转机制与使用说明 一 Overview 在开发android应用的时候,有可能需要让应用程序随着系统设置而进行调整,比如...如果系统需要监听系统设置的更改,可以考虑重写Activity的onConfigurationChanged()方法
  • 由于某些原因,例如旋转屏幕,内存不足时,造成Activity被destroy() ,或者切换语言环境时,我们recreate()该Activity。这时,如果在该Activity的onCreate中未区分是create 还是recreate就add Fragment,会再次add...
  • UnityAndroid(6) 旋转问题

    2020-01-11 20:34:52
    用UnityPlayer方式在LinearLayout内显示Unity内容,正常显示后,如果旋转屏幕,会导致Activity退出。如果Unity的Activity是MainActivity程序会崩溃;不是,会退回MainActivity。 另外另一个测试日志的Activity...
  • 1)我们不希望屏幕旋转时重建,需要对configChange属性做如下设置: android:configChanges="orientation" 2)系统配置发生改变的时候Activity都会被重建,需要对以下属性做如下设置: 用户插入...
  • 旋转屏幕、内存不足,或app内切换语言主动调用reCreate()方法,造成Activity被destroy ,系统会recreate 重新创建该Activity ,会重走onCreate()方法,如果Activity的onCreate中存在add Fragment操作,会再次add一...
  • 若我们不想app 跟着屏幕旋转旋转我们可以在manifest 文件的activity 中增加一条属性:android:screenOrientation="portrait" 若允许,那我们一般要在layout 文件中对app的旋转后的UI 界面重新设置,在Design...
  • CSDN记录我的Android之旅—— 还记得之前在做胎压监测时犯的一个错误,当时甚至不知道屏幕旋转会造成当前Activity销毁,结果当一进来应用,默认打开一个线程,屏幕翻转时出现AFC,基础有限,困扰了我很长时间。...
  • Leakcanary

    2016-10-21 19:09:00
    垃圾回收器无法回收应被回收的对象比如:在Activity生命周期过程中,旋转屏幕时应新建activity,原activity应被销毁。但如果线程一直在引用此activity会出现OOM(out of memory)二、常规检查内存泄漏的方法1....
  • 学习笔记|Android中的setRequestorientation

    千次阅读 2016-11-23 16:54:22
    设置Activity屏幕显示的方向有以下方法: 1 竖屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 2 横屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 3 ...
  • ViewModel

    2021-02-23 17:55:23
    ViewModel 类旨在以注重生命...让视图(activity,fragment)分离出数据,更专注于展示数据和用户交互,数据处理在viewmodle中完成。 数据不丢失: viewmodel可以解决如屏幕旋转导致瞬态界面相关数据的丢失或者onSave
  • 1.18工作笔记

    2019-01-18 17:32:00
    1、Fragment在新建和Add进Transation实例的时候,判断一下是否为空,因为在Activity新建的时候,Fragment队列可能保存的有历史的对象(如旋转屏幕的时候)。 2、Fragment要防止滥用,他充当一个封装可复用对象的...
  • ViewModel 类让数据可在发生屏幕旋转等配置更改后继续存在(出自官方文档)。举个例子,如果系统销毁或重新创建界面控制器,存储在其中的任何临时性界面相关数据都会丢失。例如,应用的某个 Activity 中可能包含用户...
  • //传统的new AlertDialog在屏幕旋转时,第一不会保存用户输入的值,第二还会报异常,因为Activity销毁前不允许对话框未关闭。 // 而通过DialogFragment实现的对话框可以完全不必考虑旋转的问题 public class ...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

旋转屏幕则activity