微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 以全屏制作片段编程方式

我有一个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();
}

这确实隐藏了操作栏,但它并没有隐藏系统状态栏(我在说通知,状态图标和时间在哪里),并且在滑动时动作栏隐藏/显示动画也非常波动.

有关我想要做的事情的一个例子,请参阅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: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的活动中,您需要设置标示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.

原文地址:https://www.jb51.cc/android/311993.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐