如何重用setContentView中的布局? Android的

时间:2015-04-01 04:17:33

标签: android android-layout android-videoview android-configchanges

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

感谢。

enter image description here

2 个答案:

答案 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只是一个黑客的想法)。事实证明我发现了一些代码。这是我做的:

  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不再需要它。)

  5. 这样做了!我可以随时更改方向,并随时录制我的视频。通过重新编码视频返回时,它可以轻松地以横向或纵向显示,而不会丢失视频(屏幕永远不会变黑)。

    我现在唯一的问题是我的OnTouchListener被禁用,但这是另一个问题。