23

我在一个包含 3 个片段的活动中设置了 ViewPager 和 FragmentPagerAdapter。所有片段同时加载并使用

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();
}

这确实隐藏了操作栏,但并没有隐藏系统状态栏(我说的是通知、状态图标和时间在哪里),并且操作栏隐藏/显示动画在滑动时也很不稳定。

有关我想要做什么的示例,请参阅 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 中,标签更改完成后状态栏会上下滑动。我不确定如何实现这一点,因此我们将不胜感激有关这方面的任何建议。

4

3 回答 3

13

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

诀窍是不要使用 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,但同样,这会有所不同,您可能应该以编程方式设置它。

在托管您的 Fragments、ViewPager 和 FragmentPagerAdapter 的 Activity 中,您需要设置标志告诉 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 中使用它来根据当前显示的 Fragment 动态隐藏/显示状态栏。您不能在 onPageSelected 中执行此操作,因为这将导致状态栏在滑动中途重新显示。

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

于 2013-07-20T06:01:53.713 回答
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

于 2013-07-20T00:58:27.480 回答
-3

您可以在以下位置使用此代码onCreate

 setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
 if (getSupportActionBar() != null) {
     getSupportActionBar().hide();
 }
于 2018-01-09T06:34:51.867 回答