从全屏切换到非全屏弹出/滑动

时间:2011-10-06 00:51:35

标签: android android-fullscreen

使用Android从非全屏到全屏工作正常。但是,从我的全屏活动(全屏视频播放器)返回后,当状态栏动画下来时,活动会弹出滑动。似乎恢复活动是从全屏模式激活的,但状态栏不在那里,实际活动正在被绘制,好像它已经丢失。

我试过搞清楚我的清单文件指定主题/样式。我已经尝试在设置内容视图之前以编程方式在onCreate()中执行此操作以及活动生命周期中的其他各个位置:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

似乎没有办法让状态栏在第一次绘制时保持状态栏和/或内容视图没有状态栏,然后在重新显示时调低。

有人对此有任何想法吗?我不确定是否有任何方法可以改变这种情况,这只是Android的一种行为。

提前致谢。

8 个答案:

答案 0 :(得分:2)

您需要更多标志:FLAG_LAYOUT_IN_SCREEN和FLAG_LAYOUT_NO_LIMITS。

查看http://nubinewsblog.blogspot.com/2009/11/smooth-full-screen-transition.html

答案 1 :(得分:2)

private void toggleFullscreen(boolean fullscreen)
{
    WindowManager.LayoutParams attrs = getWindow().getAttributes();
    if (fullscreen)
    {
        attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
    else
    {
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
    getWindow().setAttributes(attrs);
}

使用它肯定会起作用

答案 2 :(得分:1)

在活动布局的根视图中添加

  

机器人:paddingTop =" 25dp"

在活动的onCreate中,setContentView()添加

之前
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

答案 3 :(得分:1)

以下是我的解决方案:

在完成全屏活动

之前显示系统状态栏
@Override
public void onBackPressed() {
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    mUIHandler.post(new Runnable() {
        @Override
        public void run() {
            MyFullScreenActivity.super.onBackPressed();
        }
    });
}

答案 4 :(得分:1)

这是消除此问题的完美方法:

private void setFullscreen(boolean fullscreen) {
    WindowManager.LayoutParams attrs = getWindow().getAttributes();
    if (fullscreen) {
        attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
        attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
        attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    }
    else {
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    }
    getWindow().setAttributes(attrs);
}

在您的活动中super.onCreate(...)之前调用此内容。

答案 5 :(得分:1)

我终于找到了处理这种情况的完美方法,而不会弄乱填充。

您只需要在非全屏活动中致电此行:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

这样,在呈现全屏活动时不会更改布局,并且不会看到状态栏弹出。

答案 6 :(得分:0)

我能够通过两个步骤实现这一目标。

  1. 在我的样式中使用Theme.AppCompat.Light.NoActionBar作为我想要显示为全屏的活动。

  2. 在活动onCreate(Bundle savedInstanceState)方法中使用以下代码 WindowManager.LayoutParams attributes = getWindow()。getAttributes();     attributes.flags | = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;     getWindow()setAttributes(属性);

  3. 希望这会有所帮助。快乐编码:)

答案 7 :(得分:0)

我不知道这对你有用,但对我有用。 设置全屏活动:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.my_screen);

关闭全屏:

WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
startActivity(new Intent(getBaseContext(),NewActivity.class));
finish();