9

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

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

我用了

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

手动设置方向。它可以工作,但它会重新启动活动 - 发现调用了 onCreate()。所以视频播放意外地从头开始。我不能让它像使用onConfigurationChanged()自动旋转检测方法一样平滑。

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

谢谢你。

4

6 回答 6

6

对于手动方向更改:

<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.
    }
}
于 2013-05-29T04:09:53.757 回答
2

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

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

现在,当这些配置之一发生更改时,MyActivity 不会重新启动。相反,MyActivity 收到对 onConfigurationChanged() 的调用。此方法传递一个配置对象,该对象指定新的设备配置。

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

假设您的视频时长为 10 分钟。视频播放到 5 分钟并且方向发生变化,您知道它已经播放到 5 分钟。

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

当方向改变时,活动被破坏并重新创建。如果要保存数据并保留,可以执行以下操作以保存大量数据

 @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中的视频视图。在这种情况下,视频也是从服务器流式传输的。检查接受的答案(commonsware answer)。跟我建议的一模一样。

于 2013-03-26T08:35:52.797 回答
1

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

android:configChanges="keyboardHidden|orientation"

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

于 2013-03-26T08:30:23.680 回答
0

添加标签

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

并覆盖该方法

public void onConfigurationChanged(Configuration newConfig) {}

如果您需要在方向更改时更改布局,请检查此 替换方向更改时的布局

于 2013-03-26T09:06:47.443 回答
0

在方向更改后重新启动应用程序是不可避免的。

将与视频状态相关的变量保留在 Application 上,以便 Activity 在开始时不会重新开始播放。

此代码来自我为测试此答案而制作的示例应用程序。

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 );
}
 ...

现在轮换不会清除状态变量。

您也可以使用 Preferences 来获得更多代码量的解决方案来保留状态。首选项还将记住从一次使用应用程序到另一次使用的状态,其中应用程序状态在应用程序的 onDestroy() 中被清除。

于 2013-03-26T20:38:04.637 回答
0

我一直在寻找解决方案,对我来说,将 Manifest 中的方向定义为已锁定

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

即使您调用setRequestedOrientation() ,这也可以防止重新创建 Activity

于 2019-01-20T13:46:15.913 回答