我有一个全屏应用程序,涵盖整个屏幕,包括顶部状态栏。 由于向上/向下滑动已启用向用户显示某些选项,因此从上到下会出现滑动,状态栏正在显示(如果您想要查看通知并自上而下滑动) 。 有没有办法避免这种情况?
答案 0 :(得分:1)
对WindowManager.LayoutParams使用类型 TYPE_SYSTEM_ERROR ,以创建隐藏不可能的全屏视图。 显示状态栏和导航的滑动将被阻止。
https://github.com/dayvson/hls-endless
如果需要,你应该在显示器开机(解锁屏幕)后显示它。添加代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMainLayout = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.activity_fullscreen, null);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
WindowManager.LayoutParams handleParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
handleParams.gravity = Gravity.TOP;
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
windowManager.addView(mMainLayout, handleParams);
}
答案 1 :(得分:0)
有几种选择。行前
super.onCreate(savedInstanceState)
添加以下内容:
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
这应该完全摆脱状态栏。基本上没有标题的功能会删除顶部工具栏,为了确保全屏尺寸,我们正在为高度和宽度设置全屏标记。
就防止擦拭而言,有一个可以使用的技巧。一旦您处于真正的全屏状态,基本上会在顶部放置一个不可见的视图,以防止任何滑动。例如,
View disableStatusBarView = new View(context);
WindowManager.LayoutParams handleParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FILL_PARENT,
<height of the status bar>,
// This allows the view to be displayed over the status bar
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
// this is to keep button presses going to the background window
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
handleParams.gravity = Gravity.TOP;
context.getWindow().addView(disableStatusBarView, handleParams);
这将在状态栏上创建一个不可见的视图,该视图将接收触摸事件并阻止事件到达状态栏,从而阻止其展开。
或者,这项工作效果最好,就是覆盖windowFocusChanged方法。基本上你不会阻止状态栏扩展,但你正在阻止使用。因为一旦扩展,它就会关闭。我说这是最好的,因为使用隐形视图方法,您可能需要考虑屏幕的尺寸,以使其对所有设备都有效。所以还有更多工作要做。
首先,在清单
中声明权限<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
然后覆盖onWindowFocusChanged方法,
public void onWindowFocusChanged(boolean hasFocus)
{
try
{
if(!hasFocus)
{
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
}
}
catch(Exception ex)
{
}
}