我在一个活动中设置了一个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();
}
这会隐藏操作栏,但它不会隐藏系统状态栏(我说的是通知,状态图标和时间在哪里),并且操作栏隐藏/显示动画也非常不稳定当刷卡时。 p>
有关我想要做的事情的一个例子,请参阅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中状态栏在标签更改完成后上下滑动。我不确定如何实现这一点,所以对此方面的任何建议都将不胜感激。
答案 0 :(得分:12)
我想出了如何做到这一点,虽然这肯定是一个黑客。
诀窍不是使用Android操作栏,而是在您的布局文件中制作自己的。
我在代码中定义了两个RelativeLayouts:
<RelativeLayout
android:id="@+id/padding"
android:layout_width="fill_parent"
android:layout_height="25dip"
android:layout_alignParentTop="true"
android:background="@color/abs__background_holo_dark" />
<RelativeLayout
android:id="@+id/fake_action_bar"
android:layout_width="fill_parent"
android:layout_height="48.0dip"
android:layout_below="@id/padding" >
<!-- stuff here -->
</RelativeLayout>
顶部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。
答案 1 :(得分:3)
首先,在要隐藏状态栏的活动/片段中: 制作片段的公共静态。
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
答案 2 :(得分:-2)
您可以在onCreate
:
setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}