0

我正在尝试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。因为如果我能获得对该视图的引用,那么我就可以重用它。还是有一种我没有看到的更简单的方法?

谢谢。

在此处输入图像描述

4

2 回答 2

1

我建议为您的问题提供替代和简单的解决方案:

1.将布局activity_make_photo_video_land移动到/res/layout-land/文件夹并重命名为activity_make_photo_video.xml

这样,当方向更改为 LANDSCAPE 时,您的 activity_make_photo_video_land 视图(重命名为 activity_make_photo_video)将会膨胀

因此,您不需要从 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() 后,将创建活动的新实例,其中包含前一个实例从 onSaveInstanceState(Bundle) 生成的任何已保存实例状态。

覆盖 onSaveInstanceState(Bundle) 并在此处保存您的状态

你可以在这里查看更多

我希望这会奏效

于 2015-04-01T04:26:07.360 回答
1

感谢@Kushal 的建议,我研究了两种方法,onSaveInstanceState(Bundle savedInstanceState)并在配置更改onRestoreInstanceState(Bundle savedInstanceState)时保存我的VideoView状态(因为这是我问题的根源,而使用setContentView只是一个黑客想法)。原来我在那里找到了一些代码。这是我所做的:

  1. 确保我有一个风景xml和一个常规的xml. 在我的layout-landlayout文件夹中分别具有相同的名称。

  2. 像这样覆盖这两种方法:

    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);
    }
    
  3. 从我的清单中android:configChanges="keyboardHidden|orientation|screenSize"取出。

  4. 删除了该onConfigurationChanged(Configuration newConfig)方法(不再需要它,#3 消失了)。

这做到了!我可以随时改变方向,并随时录制我的视频。从重新编码视频返回后,它可以轻松地以横向或纵向显示,而不会丢失视频(屏幕从未变黑)。

我现在唯一的问题是我OnTouchListener的残疾,但这是另一个问题。

于 2015-04-01T05:57:54.737 回答