我正在尝试在我的Manifest中使用android:configChanges="keyboardHidden|orientation|screenSize"
,以便在配置更改发生时我不会丢失VideoView
的状态。这意味着我需要在配置上自己选择布局。我遇到的问题是,当我第一次初始化要在onCreate
中使用的视图时,在这里:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.activity_make_photo_video_land);
} else if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.activity_make_photo_video);
}
}
选择正确的布局。但是当我需要调整配置更改的布局时,就像这里:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.activity_make_photo_video_land);
} else if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.activity_make_photo_video);
}
}
它不使用相同的布局实例,而是重新加载它,这使我的VideoView
变黑。然后我无法按下任何按钮。
有没有办法重用初始布局?我试图将这个setContentView(R.layout.activity_make_photo_video_land);
的视图设置为Activity activity
对象,但IDE不会让我,它说Activity is incompatible with void
。因为如果我可以获得对该视图的引用,那么我可以重用它。或者有一种更简单的方法可以做到这一点,我没有看到?
感谢。
答案 0 :(得分:1)
我建议为您的问题提供替代和简单的解决方案:
1。将布局activity_make_photo_video_land移至/ res / layout-land /文件夹并将其重命名为activity_make_photo_video.xml
这样你的activity_make_photo_video_land视图(重命名为 当方向改变时,activity_make_photo_video)将被充气 到LANDSCAPE
因此,您无需从Java代码手动处理这些工具。
将onCreate()更改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_make_photo_video_land);
}
您的应用程序将在 / res / layout / 和 / res / layout-land / 这两个文件夹中具有单一布局activity_make_photo_video
更新:
除非您另行指定,否则配置更改(例如更改 在屏幕方向,语言,输入设备等)将导致您的 当前活动将被销毁,正常活动 onPause(),onStop()和onDestroy()的生命周期过程为 适当。如果活动位于前景或可见 用户,一旦onDestroy()在该实例中被调用,然后是新的 无论如何都会创建活动的实例 之前实例生成的savedInstanceState 的onSaveInstanceState(束)。
覆盖onSaveInstanceState(Bundle)并在此处保存您的状态
您可以查看更多Here
我希望这会起作用
答案 1 :(得分:1)
感谢@Kushal建议,我研究了onSaveInstanceState(Bundle savedInstanceState)
和onRestoreInstanceState(Bundle savedInstanceState)
的两种方法来保存我的VideoView
状态配置更改(因为这是我问题的根源,并且使用setContentView
只是一个黑客的想法)。事实证明我发现了一些代码。这是我做的:
确保我有一个格局xml
和一个普通的xml
。在我的layout-land
和layout
文件夹中分别使用相同的名称。
覆盖这两种方法:
private int position = 0;
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// use onSaveInstanceState in order to store the video
// playback position for orientation change
savedInstanceState.putInt("Position", videoView.getCurrentPosition());
videoView.pause();
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// use onRestoreInstanceState in order to play the video playback
// from the stored position
position = savedInstanceState.getInt("Position");
videoView.seekTo(position);
}
从我的清单中取出android:configChanges="keyboardHidden|orientation|screenSize"
。
删除onConfigurationChanged(Configuration newConfig)
方法(#3不再需要它。)
这样做了!我可以随时更改方向,并随时录制我的视频。通过重新编码视频返回时,它可以轻松地以横向或纵向显示,而不会丢失视频(屏幕永远不会变黑)。
我现在唯一的问题是我的OnTouchListener
被禁用,但这是另一个问题。