![](/img/trans.png)
[英]How to refresh an Android RelativeLayout when orientation changes without restarting the Activity?
[英]Android: manual screen orientation without restarting the activity?
我需要制作一个应用程序播放带有全屏视频按钮的视频。 该按钮用于在视频显示的横向和纵向之间手动切换。 我们不希望自动旋转检测。 因此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()
一样平滑 - 自动旋转检测方法。
那么如何在不重新启动活动的情况下更改手动屏幕方向?
谢谢。
对于manaul方向更改:
<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 。 您可以查看“ 处理配置更改自己 ”标题下的链接
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
现在,当其中一个配置发生更改时,MyActivity不会重新启动。 相反,MyActivity接收对onConfigurationChanged()的调用。 此方法传递一个Configuration对象,该对象指定新设备配置。
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中的VideoView 。 在这种情况下,视频也从服务器流式传输。 检查接受的答案(commonsware答案)。 我建议完全一样。
首先将android:configChanges
节点添加到Activity's
manifest节点
android:configChanges="keyboardHidden|orientation"
有关更多信息,请查看此链接
添加标签
"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation" for your activity in Manifest.xml,
并覆盖该方法
public void onConfigurationChanged(Configuration newConfig) {}
如果您需要在orientationchange chek 上更改布局,则可以在方向更改时替换布局
在方向更改后重新启动应用程序是不可避免的。
保持与视频状态相关的变量在应用程序上,以便活动不会在开始时重新开始播放。
此代码来自我为测试此答案而制作的示例应用程序。
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 );
}
...
现在旋转不会清除状态变量。
您也可以使用“首选项”来获取更多代码密集型解决方案来保留状态。 首选项还将记住从一次使用应用程序到另一次应用程序的状态,其中应用程序状态被清除应用程序的onDestroy()。
我一直在寻找解决方案,对我来说,在Manifest中将方向定义为锁定 :
<activity
android:name=".VideoActivity"
android:screenOrientation="locked"
android:configChanges="keyboardHidden"/>
即使您调用setRequestedOrientation() ,也可以防止重新创建Activity
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.