Android 安卓4.2.2+;
我想覆盖android状态栏。就我而言,它在上面。我不想覆盖或隐藏导航栏 注意:解决方案必须在android 4.2.2+上运行。我更喜欢非根设备的答案 我已经搜索了很多这样的问题和答案,但没有一个能在4.2.2上运行 下面是我的代码,但它不使用触摸事件。这就是状态栏打开面板的原因。我不想要这个Android 安卓4.2.2+;,android,android-ui,statusbar,android-4.2-jelly-bean,android-launcher,Android,Android Ui,Statusbar,Android 4.2 Jelly Bean,Android Launcher,我想覆盖android状态栏。就我而言,它在上面。我不想覆盖或隐藏导航栏 注意:解决方案必须在android 4.2.2+上运行。我更喜欢非根设备的答案 我已经搜索了很多这样的问题和答案,但没有一个能在4.2.2上运行 下面是我的代码,但它不使用触摸事件。这就是状态栏打开面板的原因。我不想要这个 @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSys
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);
overlay = new Button(this);
overlay.setBackgroundColor(Color.GREEN);
overlay.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("StatusBar", "touched");
return false;
}
});
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FILL_PARENT,
statusBarHeight,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH|
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.RIGHT;
windowManager.addView(overlay, params);
}
@Override
public void onDestroy() {
super.onDestroy();
if (overlay != null) windowManager.removeView(overlay);
}
在主活动中,我启动服务:
startService(new Intent(this, StatusBarService.class));
并且在AndroidManifest.xml中添加了权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
现在证明它可以在4.2.2中实现:
怎么做?
屏幕截图:
你不能将你的应用程序放在一个notitlebar主题中[不应该删除导航栏],并在顶部实现你自己的视图,该视图模仿通知栏的外观作为一个容器,其余的内容将是片段吗?在尝试和重复之后,这为我做到了:
int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT,
statusBarHeight,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
它适用于4.2.2和4.4.2,我们无法阻止状态在kitkat设备中以全屏模式出现,因此进行了一项仍然符合要求的黑客攻击,即阻止状态栏扩展 为了实现这一点,该应用程序并没有全屏显示。我们在状态栏上放置一个覆盖,并使用所有输入事件。它阻止了地位的扩大 注意:
- customViewGroup是扩展任何 布局(框架、相对布局等)并使用触摸事件李>
- 要使用触摸事件,请重写的onInterceptTouchEvent方法 查看组并返回true
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
注意:不需要生根请提供一些您想要的屏幕截图/图片achieve@JiMMaR:最好的可视化方法是安装并运行MobiLock launcher。密切关注他们的自定义状态栏。即使你在launcher中运行一个允许的应用程序,它也会保持不变。@JiMMaR屏幕截图补充说,当launcher的主窗体位于顶部时,这一点很有效。但如果启动了另一个应用程序,状态栏将再次显示。我设法用StatusBarService.class隐藏了状态栏。但触摸事件被转发到后台的状态栏。所以用户可以滑动状态面板。嗨@Solata,我没有针对你的任何个人信息。谢谢你的澄清。我也会投票赞成你的答案。答案也有很好的解释。通常Stackoverflow包含很多用户,只是为了创建这样的配置文件。关于我的名誉,我不在乎。我来这里不是为了获得好的声誉,我通常不会只阅读拥有40K或更多用户的帖子。有很多人知识渊博,回答得很好,但在这里名声不好。@AzatMartirosyan:我喜欢你关心这件事,但你的方法不好。Stackoverflow有很好的QA评级流程来避免这种非建设性的评论。我应该在statusBarHeight使用什么价值?这在昨天对我有效,但由于某种原因今天不行。。。我无法让它恢复工作。我使用的代码与您发布的代码完全相同。我无法帮助您了解上述详细信息。@Machado如果您能解释您所做的一切,我可以帮助您
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>