以编程方式全屏制作片段

我有一个ViewPager和FragmentPagerAdapter在一个活动中设置3个片段。 所有片段同时加载并使用保存在内存中

mPager.setOffscreenPageLimit(2); 

其中一个片段包含我想要全屏显示的相机预览,没有状态栏或操作栏。 其他片段要求显示操作栏。

如何在保持其他两个片段正常的同时,仅将相机预览片段全屏显示? 我尝试过使用主题,这意味着打破了操作栏。

以编程方式调用以下内容没有帮助,因为它强制整个活动全屏(因此其他两个片段随之而来):

 requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); 

我也尝试过实现ViewPager.OnPageChangeListener:

 public void onPageSelected(int position) { if(position == 1) getActionBar().hide(); else getActionBar().show(); } 

这确实隐藏了操作栏,但它没有隐藏系统状态栏(我正在谈论通知,状态图标和时间的位置),并且操作栏隐藏/显示animation在滑动时也非常不连贯。

有关我想要做的事情的一个例子,请参阅Snapchat – 他们设法完美地完成相机和其他片段之间的滑动。

编辑:

所以我将onPageSelected更改为:

 public void onPageSelected(int position) { if(position == 1) { MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } else { MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } } 

这使我可以更改状态栏是否显示。 但是,它会造成大量的猛击。 操作栏的问题相同。

我注意到在Snapchat中状态栏在标签更改完成后上下滑动。 我不确定如何实现这一点,所以有关这方面的任何建议将不胜感激。

我想出了如何做到这一点,虽然它绝对是一个黑客。

诀窍不是使用Android操作栏,而是在您的布局文件中制作自己的操作栏。

我在代码中定义了两个RelativeLayouts:

     

顶部RelativeLayout是Android状态栏的填充。 我将它设置为25dip,但它可能会有所不同 – 最好以编程方式设置此值。 此外,您需要将其设置为黑色,以便它与状态栏颜色匹配,并使UI看起来更自然。

底部RelativeLayout适用于您的假动作栏。 您需要在此RelativeLayout中填充操作栏所需的所有内容(标题文本,按钮等)。 我将它设置为48dip,但同样,这将有所不同,你应该以编程方式设置它。

在托管您的片段,ViewPager和FragmentPagerAdapter的活动中,您需要设置告诉Android的标志以使状态栏成为叠加:

 WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

现在我们需要在切换片段时隐藏状态栏并显示。 让您的活动实现ViewPager.OnPageChangeListener,然后使用以下代码:

 @Override public void onPageScrollStateChanged(int state) { switch(state) { case ViewPager.SCROLL_STATE_IDLE: if(mPosition == 1) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mPosition = position; } 

我们使用onPageSelected跟踪页码,并在onPageScrollStateChanged中使用它来动态隐藏/显示状态栏,具体取决于当前显示的片段。 您无法在onPageSelected中执行此操作,因为这将导致状态栏在滑动中途重新显示。

您还需要确保为假动作栏添加适当的代码 – 对于按钮,这将是OnClickListener。

首先,在要隐藏状态栏的活动/片段中:创建片段的公共静态。

 public static Fragment QSFrag; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); QSFrag = this; } 

然后在你的onPageSelected:

 public void onPageSelected(int position) { // TODO Auto-generated method stub if(position == 1){ mActionBar.hide(); YourActivityWithNoStatusOrActionBar.QSFrag.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); }else{ mActionBar.show(); // mActionBar.setSelectedNavigationItem(position); I use this, not sure u need/want it. } } 

我刚刚测试了它,它的工作原理。 但是当你离开没有状态栏的片段时,它看起来并不棒。 :p

您可以在onCreate使用此代码:

  setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); if (getSupportActionBar() != null) { getSupportActionBar().hide(); }