Android:手动屏幕方向而不重新启动活动?

我需要制作一个应用程序在video上播放全屏的button。 该button用于在video显示的横向和纵向之间手动切换。 我们不希望自动旋转检测。 所以Manifest文件设置如下。

<activity android:name=".VideoActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden"/> 

我用了

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 或者setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

手动设置方向。 它的工作,但重新开始活动 – findonCreate()被调用。 所以video播放从一开始意外地重新开始。 我不能像使用onConfigurationChanged() – 自动旋转检测方法那样平滑。

那么如何在不重新启动活动的情况下手动改变屏幕方向呢?

谢谢。

Solutions Collecting From Web of "Android:手动屏幕方向而不重新启动活动?"

为了改变方向:

 <activity android:name=".VideoDetails" android:configChanges="orientation"/> public class VideoDetails extends Activity { ... onStart() { setRequestedOrientation(orientation); } onConfigurationChanged(Configuration newConfig){ // do stuff for orientation change. } onClick() { setRequestedOrientation(orientation); } } 

对于自动定位检测:

 <activity android:name=".VideoDetails" android:configChanges="orientation"/> public class VideoDetails extends Activity { ... onConfigurationChanged(Configuration newConfig){ // do stuff for orientation change. } } 

http://developer.android.com/guide/topics/resources/runtime-changes.html 。 您可以查看标题“ 处理configuration更改自己”下的链接

 <activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name"> 

现在,当其中一个configuration更改时,MyActivity不会重新启动。 相反,MyActivity接收到对onConfigurationChanged()的调用。 此方法传递一个Configuration对象,该对象指定新的设备configuration。

  android:configChanges="orientation|screenSize" (andorid 3.2 and above screen size also changes. add this) 

假设你的video是10分钟。 video播放到5分钟,方向改变,你知道它已经玩了5分钟。

您可以将video的实际进度保存在onSaveInstanceState()中,并将保存的数据从Bundle中获取到onRestoreInstanceState()中,然后可以使用进度数据开始播放,如果没有保存数据则从头开始播放。

当方向更改时,活动被破坏并重新创build。 如果要保存数据并保留,可以按照以下方式保存大量数据

  @Override public Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); if (data == null) { data = loadMyData(); } } 

对于一小组数据

  @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); // Save UI state changes to the savedInstanceState. // This bundle will be passed to onCreate if the process is // killed and restarted. savedInstanceState.putString("NICK_NAME", Name);//save nick name } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // Restore UI state from the savedInstanceState. // This bundle has also been passed to onCreate. Name = savedInstanceState.getString("NICK_NAME");//restore nick name } 

检查方向

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Checks the orientation of the screen if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); } } 

Android中的VideoView 。 在这种情况下,video也从服务器stream式传输。 检查接受的答案(普通答案)。 完全一样的我build议。

首先将android:configChanges节点添加到Activity's清单节点

 android:configChanges="keyboardHidden|orientation" 

有关更多信息,请查看此链接

添加标签

 "android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation" for your activity in Manifest.xml, 

并覆盖该方法

 public void onConfigurationChanged(Configuration newConfig) {} 

如果您需要在orientationchange上更改布局,则可以replace方向更改的布局

定位更改后重新启动应用程序是不可避免的。

将与video状态相关的variables保存在应用程序上,以便活动在开始时不重新开始播放。

这段代码来自于我为了testing这个答案而创build的示例应用程序。

 public class MyApplication extends Application { int counter; @Override public void onCreate() { super.onCreate(); counter = 0; } } 

在清单中添加应用程序

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="com.example.orientationchange.MyApplication" > <activity ... 

使用活动:

 public class MainActivity extends Activity { TextView output; MyApplication app ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = (MyApplication) getApplication(); setContentView(R.layout.activity_main); output = (TextView) findViewById(R.id.output); //A counter thread used to test the solution. new CounterTask().execute( 100 ); } ... 

现在旋转不会清除状态variables。

您也可以使用首选项来获取更多的代码繁重的解决scheme来保存状态。 首选项还会记住从应用程序的一次使用到另一次应用程序状态已清除应用程序的onDestroy()的状态。