在我的服务我视图添加到WindowManager同addView().当我准备隐藏视图时,我removeView()使用View引用调用.这很有效 - 大部分时间.
我偶尔会有Force Close报告说View没有附加到WindowManager.这是有道理的.问题是,我认为该服务正在被Android杀死,当它是时候隐藏视图时,它会尝试删除错误的View View.
我已经尝试检查View是否为null,但显然它不是在这一点上,它根本就不是附加到的那个WindowManager.似乎如果View参考丢失,则无法再次访问它.
我怎样才能获得findViewById()与WindowManager自身相同的东西?如果我的服务被停止(被杀),会View自动删除WindowManager吗?有没有办法我可以存储引用,View以便如果服务停止我仍然可以删除View后者(我也试图避免泄漏View)?
如何滑入键盘?我试过:
val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current
keyboardController?.show()
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我缺少什么?也许一些清单标志?
android-windowmanager android-window android-jetpack android-jetpack-compose
这是我的代码:
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
wm = (WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mTopView = (ViewGroup) inflater.inflate(R.layout.activity_invisible, null);
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_DIM_BEHIND
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_FULLSCREEN;
if (keep==true) {
int value = brightnessIntent.getExtras().getInt("value");
float v=value/255.0f;
params.dimAmount=0;
params.alpha=v;
rl = (RelativeLayout) mTopView.findViewById(R.id.window);
getWindow().setAttributes(params);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
wm.addView(mTopView, params);
}
Run Code Online (Sandbox Code Playgroud)
视图仍显示状态栏,mTopView是一个叠加窗口.如何让覆盖窗口覆盖整个屏幕?我不想"隐藏"状态栏,我希望我的活动叠加到它上面.
[编辑] 强调文字
我已经在我的onCreate()方法中有这个:
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)
我的清单定义了一个全屏的风格.
SCREENSHOTS
这是目前的情况,我希望叠加层也扩展到状态栏.
我不了解WindowInsets rects,因为docs说:
系统窗口插图表示全屏窗口的区域,该区域被状态栏,导航栏,IME或其他系统窗口部分或完全遮盖.
因此,多个WindowInsets可以在每个都有自己的rect(一个用于状态栏,另一个用于导航栏......),我该如何检索它们?
或者是有只有一个WindowInsets和它的左顶右底坐标是该应用的可用窗口的矩形?
我试图创建一个高于其他应用程序的视图:
WindowManager.LayoutParams paramsDirectorView = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)
我查看了其他回复,发现了以下"绘制应用程序"的内容:
我仍然得到" - 窗口类型2038的权限被拒绝"错误.截至目前我正在使用TYPE_PHONE并且它可以工作,但它已被弃用并且说要使用TYPE_APPLICATION_OVERLAY.有人可以对此进行跟进,因为TYPE_PHONE答案不是真正的解决方案,而是Android O中不推荐使用的"补丁工作"解决方案.
我在Android 7.1.2上运行
android.view.WindowManager $ BadTokenException:无法添加窗口android.view.ViewRootImpl$W@1f47e89 - android.app.ActivityThread上android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3344)的窗口类型2038的权限被拒绝.- wrap21(ActivityThread.java)位于android.app.AooT.Thread上的android.O. HandleMessage(Handler.java:102)上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1583).(Looper) .java:154)在android.app.ActivityThread.main(ActivityThread.java:6121)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit) .java:889)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)引起:android.view.WindowManager $ BadTokenException:无法添加窗口android.view.ViewRootImpl$W@1f47e89 - 在Android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)的android.view.ViewRootImpl.setView(ViewRootImpl.java:703)上的窗口类型2038的权限被拒绝 HeadService.TwoViewManager的android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93).(两个ViewManager.java:99)位于android.app.ActivityThread.handleServiceArgs(ActivityThread)的HeadService.UIHeadService.onStartCommand(UIHeadService.java:65). java:3327)在Android.app.Handler.dispatchMessage(Handler.java:102)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1583)的android.app.ActivityThread.-wrap21(ActivityThread.java)在android.os.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6121),位于com.android.internal的java.lang.reflect.Method.invoke(Native Method) .os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
在我的应用程序中,我有一个带有页脚的ListView,其中包含一个带有EditText的自定义视图.顶部有一个动作栏.当前活动使用SOFT_INPUT_ADJUST_RESIZE(adjustResize)作为软输入模式,并且在滚动时不关闭键盘.
为了显示更多列表,我想在滚动时移除键盘并获得更平滑的滚动行为,我想要更改以便使用SOFT_INPUT_ADJUST_PAN(adjustPan).但是,如果我改为adjustPan,则整个视图(包括操作栏)会被推高.我希望列表视图被推送,但操作栏始终保持在顶部.这可能吗?如果没有,是否可以使用adjustResize并获得平滑的调整大小动画?
到目前为止,我尝试过:
Window.FEATURE_ACTION_BAR_OVERLAY,但这没有帮助,虽然文档听起来很有希望.adjustResize,由于滚动时发生的绘图行为,最小化键盘并同时调整列表视图的大小,我已排除了这一点.有没有办法制作流畅的动画调整大小?android android-layout android-softkeyboard android-windowmanager android-actionbar
注意
如果有人知道如何订购(z-order)Windows通过windowmanager添加,我也会接受答案,因为它将回答所有问题.实际上我只是windowManager.removeView(MyView)立即通过windowManager.addView(MyView)将视图放在另一个视图之前进行跟踪,但这并不理想,因为它可视地删除并添加视图.它看起来很疯狂,他们在android中没有构建功能来做这么简单的思考.
我创建了一个包含EditText的视图(linearlayout).我通过WindowManager.addView(view,Layout_Params)在活动中添加此视图;
但我有问题,edittext将生成的每个弹出窗口(如复制/过去菜单或单词建议菜单)将在其他视图下,甚至在他们自己的EditText视图下(不在图片上,edittext具有透明背景)
我用这些布局参数创建视图(即:LinearLayout):
protected WindowManager.LayoutParams createLayoutParams() {
WindowManager.LayoutParams p = new WindowManager.LayoutParams();
p.gravity = Gravity.LEFT | Gravity.TOP;
p.width = 0;
p.height = 0;
p.format = PixelFormat.TRANSLUCENT;
p.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED;
p.flags = NOT_FOCUSABLE_FLAGS;
// TYPE_APPLICATION allows for popups in browser windows (like edit menus)
p.type = WindowManager.LayoutParams.TYPE_APPLICATION;
p.token = null;
return p;
}
Run Code Online (Sandbox Code Playgroud)
我显示视图(谁只包含一个edittext)像这样:
private final WindowManager mWindowManager;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams lp = createLayoutParams();
mWindowManager.addView(view, lp);
Run Code Online (Sandbox Code Playgroud)
那么如何让弹出窗口连接到editText前面的一切?
这个问题也可能有点帮助(关于窗口视图的z顺序): …
android android-layout android-edittext android-view android-windowmanager
在android oreo中,我不能再使用WindowManager.LayoutParams.TYPE_SYSTEM_ERROR了,必须使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY.缺点是,此模式不会覆盖状态栏.
反正有没有实现旧的行为,并能够绘制状态栏?我有一个侧边栏应用程序,直到现在,我允许用户在屏幕顶部也有触发区域,现在不再工作,因为状态栏现在重叠在顶部的可触摸区域...
我对任何解决方案感兴趣,即使它仅适用于某些设备,例如root设备......因为我认为这个问题没有正常的解决方案,因为android系统不再允许这样做,如文档中所述(https://developer.android.com/about/versions/oreo/android-8.0-changes.html#o-apps).不过,这并不意味着没有替代解决方案......
permissions android overlay android-windowmanager android-8.0-oreo
我正在将我的应用程序定位到Android O.在我的应用程序中,我有一个作业服务,显示所有其他应用程序的窗口,因此当它触发时,即使屏幕关闭和解锁并打开它,也需要显示此窗口.我已经在preior Android版本中实现了这种行为,但是在Android O中它没有像我预期的那样工作.
我已经读过我需要使用该标志TYPE_APPLICATION_OVERLAY并<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>在清单文件中添加了权限.
所以它在屏幕打开时工作正常,但是当屏幕关闭时我注意到它没有打开屏幕,当我转动屏幕时,我看到窗口是在其他应用程序之上创建的.
所以我的问题是因为旗帜FLAG_TURN_SCREEN_ON并且FLAG_SHOW_WHEN_LOCKED在Android API 27中被弃用了,有什么替代方法呢?
这是我目前的代码:
private void showView()
{
if (!wakeLockAcquired)
{
wakeLock.acquire();
wakeLockAquired = true;
}
windowManager = (WindowManager)context.getSystemService(WINDOW_SERVICE);
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,
PixelFormat.RGBA_8888);
RelativeLayout layout = buildView();
windowManager.addView(layout, layoutParams);
windowManager.updateViewLayout(layout, layoutParams);
}
Run Code Online (Sandbox Code Playgroud)
笔记:
我在Android工作.我需要以全屏模式显示我的活动,我使用以下代码完成此操作.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)
现在它看起来像这样: -

现在我想退出这个完整模式,所以我的活动应该像以前一样显示.像这样:-

我有一个按钮,用于在完全模式或正常模式之间切换,我将一次又一次地切换模式.请建议我怎么做这个.意味着如何从全屏获得正常的屏幕.
先感谢您.