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

问题描述 投票:6回答:8

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

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

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

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

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

提前致谢。

android android-fullscreen
8个回答
2
投票

您还需要一些标志:FLAG_LAYOUT_IN_SCREEN和FLAG_LAYOUT_NO_LIMITS。

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


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

使用它肯定会起作用


1
投票

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

机器人:paddingTop = “25dp”

在活动的onCreate,在setContentView()之前添加

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

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

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(...)之前调用此方法。


1
投票

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

您只需在非全屏活动中调用此行:

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

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


0
投票

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

  1. 在我的样式中使用Theme.AppCompat.Light.NoActionBar作为我想要显示为全屏的Activity。
  2. 在Activity的onCreate(Bundle savedInstanceState)方法中使用以下代码WindowManager.LayoutParams attributes = getWindow()。getAttributes(); attributes.flags | = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; getWindow()setAttributes(属性)。

希望这可以帮助。快乐编码:)


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();
© www.soinside.com 2019 - 2024. All rights reserved.