标签: android-windowmanager

跟踪视图添加到WindowManager(没有findViewById()函数?)

在我的服务我视图添加到WindowManageraddView().当我准备隐藏视图时,我removeView()使用View引用调用.这很有效 - 大部分时间.

我偶尔会有Force Close报告说View没有附加到WindowManager.这是有道理的.问题是,我认为该服务正在被Android杀死,当它是时候隐藏视图时,它会尝试删除错误的View View.

我已经尝试检查View是否为null,但显然它不是在这一点上,它根本就不是附加到的那个WindowManager.似乎如果View参考丢失,则无法再次访问它.

我怎样才能获得findViewById()WindowManager自身相同的东西?如果我的服务被停止(被杀),会View自动删除WindowManager吗?有没有办法我可以存储引用,View以便如果服务停止我仍然可以删除View后者(我也试图避免泄漏View)?

android view android-windowmanager

17
推荐指数
2
解决办法
9388
查看次数

如何使用 Jetpack Compose 显示键盘?

如何滑入键盘?我试过:

val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current
  keyboardController?.show()
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我缺少什么?也许一些清单标志?

android-windowmanager android-window android-jetpack android-jetpack-compose

17
推荐指数
3
解决办法
1万
查看次数

WindowManager中的全屏

这是我的代码:

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

在此输入图像描述

这是目前的情况,我希望叠加层也扩展到状态栏.

android viewgroup android-windowmanager android-activity

16
推荐指数
2
解决办法
3万
查看次数

有多少WindowInsets?

我不了解WindowInsets rects,因为docs说:

系统窗口插图表示全屏窗口的区域,该区域被状态栏,导航栏,IME或其他系统窗口部分或完全遮盖.

因此,多个WindowInsets可以在每个都有自己的rect(一个用于状态栏,另一个用于导航栏......),我该如何检索它们?

或者是有只有一个WindowInsets和它的左顶右底坐标是该应用的可用窗口的矩形?

android android-view android-windowmanager

16
推荐指数
1
解决办法
2165
查看次数

Android:使用TYPE_APPLICATION_OVERLAY拒绝窗口类型2038的权限

我试图创建一个高于其他应用程序的视图:

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)

我查看了其他回复,发现了以下"绘制应用程序"的内容:

  • 我在清单中有android.permission.SYSTEM_ALERT_WINDOW
  • 我正在进行Settings.canDrawOverlays(this)检查,返回true.
  • 我已经完成了所有位于这里的窗口类型的权限被拒绝

我仍然得到" - 窗口类型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)

android android-windowmanager android-layoutparams

16
推荐指数
3
解决办法
2万
查看次数

使用adjustPan作为软输入模式时,是否可以始终显示操作栏?

在我的应用程序中,我有一个带有页脚的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

15
推荐指数
1
解决办法
1689
查看次数

为什么我的EditText复制/粘贴菜单位于EditText下?如何更改弹出窗口的z顺序?

注意

如果有人知道如何订购(z-order)Windows通过windowmanager添加,我也会接受答案,因为它将回答所有问题.实际上我只是windowManager.removeView(MyView)立即通过windowManager.addView(MyView)将视图放在另一个视图之前进行跟踪,但这并不理想,因为它可视地删除并添加视图.它看起来很疯狂,他们在android中没有构建功能来做这么简单的思考.


我创建了一个包含EditText的视图(linearlayout).我通过WindowManager.addView(view,Layout_Params)在活动中添加此视图;

但我有问题,edittext将生成的每个弹出窗口(如复制/过去菜单或单词建议菜单)将在其他视图下,甚至在他们自己的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

15
推荐指数
1
解决办法
1141
查看次数

Oreo(API 26) - drawOverlay +绘制状态栏

在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

15
推荐指数
1
解决办法
3620
查看次数

Android O - FLAG_SHOW_WHEN_LOCKED已弃用

我正在将我的应用程序定位到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)

笔记:

  • buildView是一个返回relativeLayout的函数,在这个函数中我是动态添加内容的(TextView,ImageView等).
  • wakeLockAcquired是一个布尔成员,在视图被销毁时设置为false.

android android-windowmanager android-8.0-oreo

15
推荐指数
3
解决办法
1万
查看次数

android从全屏模式退出

我在Android工作.我需要以全屏模式显示我的活动,我使用以下代码完成此操作.

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)

现在它看起来像这样: - 在此输入图像描述

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

在此输入图像描述

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

先感谢您.

android layoutparams android-windowmanager

14
推荐指数
2
解决办法
2万
查看次数