天道酬勤,学无止境

android-windowmanager

BadTokenException 无法在 PopUpWindow 中添加窗口微调器(BadTokenException Unable to add Window Spinner in PopUpWindow)

问题 我知道这里有很多类似的问题,但我无法将答案转移到我的问题上(或者我没有找到我需要的答案......) 在我的 actionBar 菜单中(在 onOptionsItemSelected 中),我打开了一个用于用户设置的弹出窗口。 复选框和单选按钮工作正常,但如果我在微调器上使用标签,则会出现致命异常: FATAL EXCEPTION: main android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@42766f00 is not valid; is your activity running? 这是onOptionsItemSelected方法中的代码: LayoutInflater inflaterSettings = LayoutInflater.from(context); final LinearLayout llSettings = (LinearLayout) inflaterSettings.inflate(R.layout.actionbar_menu_settings_popup, null); Spinner spinner = (Spinner) llSettings .findViewById(R

2021-10-22 04:47:43    分类:技术分享    android   popupwindow   android-windowmanager

带有不透明导航栏的深色文本透明状态栏(Dark-text transparent status bar with opaque navigation bar)

问题 等等,它不是重复的 这里已经提出了一个类似的问题,但没有解决暗文本状态栏。 我想做的事 我想实现在同一时间3件事情: 透明状态栏(不隐藏!) 深色文本状态栏不透明(或黑色)导航栏(不会让活动内容在其下方膨胀) 我试过的 解决方案 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 只能达到1和3; 这里的解决方案只能实现1和2; 而这里的解决方案只能实现2和3.... 问题 那么有没有办法实现所有 1、2 和 3?! 回答1 在styles.xml : <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> ... <item name="android:navigationBarColor">@android:color/black</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> 在活动的onCreate() : override fun onCreate

2021-10-22 00:50:07    分类:技术分享    android   android-view   statusbar   android-windowmanager   android-window

BadTokenException Unable to add Window Spinner in PopUpWindow

I know there are a lot of similar questions here, but I'm not able to transfer the answers to my problem (or I didn't find THE answer I need...) In my menu on actionBar (in onOptionsItemSelected) I open a popupWindow for user settings. Checkbox and RadioButtons work fine, but if I tab on the Spinner, there will be a FATAL EXCEPTION: FATAL EXCEPTION: main android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@42766f00 is not valid; is your activity running? This is the code in the onOptionsItemSelected Method: LayoutInflater inflaterSettings =

2021-10-21 19:34:58    分类:问答    android   popupwindow   android-windowmanager

Android O - FLAG_SHOW_WHEN_LOCKED 已弃用(Android O - FLAG_SHOW_WHEN_LOCKED is deprecated)

问题 我将我的应用程序定位到 Android O。在我的应用程序中,我有一个作业服务,它在所有其他应用程序上显示一个窗口,因此当它触发时,它需要显示此窗口,即使屏幕关闭和解锁并打开它. 我已经在之前的 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)

2021-10-21 04:20:07    分类:技术分享    android   android-windowmanager   android-8.0-oreo

Android:使用 TYPE_APPLICATION_OVERLAY 拒绝窗口类型 2038 的权限(Android: permission denied for window type 2038 using TYPE_APPLICATION_OVERLAY)

问题 我试图创建一个高于其他应用程序的视图: 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); 我查看了其他回复,并找到了以下有关“绘制应用程序”的内容: 我在清单中有 android.permission.SYSTEM_ALERT_WINDOW 我正在做 Settings.canDrawOverlays(this) 检查,结果为真。 我已经完成了所有位于此处的窗口类型权限被拒绝 我仍然收到“-- 窗口类型 2038 的权限被拒绝”错误。 到目前为止,我正在使用 TYPE_PHONE 并且它可以工作,但它已被弃用并说使用 TYPE_APPLICATION_OVERLAY。 有人可以对此进行跟进吗,因为 TYPE_PHONE 答案并不是真正的解决方案,而是在

2021-10-18 20:54:28    分类:技术分享    android   android-windowmanager   android-layoutparams

Oreo (API 26) - drawOverlay + draw over status bar(Oreo (API 26) - drawOverlay + draw over status bar)

问题 在 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)。 尽管如此,这并不意味着没有替代解决方案...... 回答1 文档说非系统应用程序不推荐使用该标志。 您是否尝试将应用程序设为系统应用程序? 此常量在 API 级别 26 中已弃用。对于非系统应用程序。 以下是 ES 文件资源管理器的操作方法: Configure ES File Explorer by doing the following steps: Launch ES File

2021-10-18 16:23:15    分类:技术分享    android   permissions   overlay   android-windowmanager   android-8.0-oreo

如何从视图中获取窗口实例?(How to get the window instance from a view?)

问题 我通过mWindowManager.addview()在 windowManager 中添加了一个视图。 现在我想知道是否有可能获得window实例。 它们是myView.getWindowID()和myView.getWindowToken()但我找不到从中检索窗口实例的方法 回答1 如果您的View已附加到Activity ,您可以这样做。 View view; // your view if (view.getContext() instanceof Activity) { Window window = ((Activity) view.getContext()).getWindow(); } API 19之后,有一个方便的检查方法, view.isAttachedToWindow() 回答2 您无法从View或WindowManager获取window实例。 但是您可以通过调用此方法myView.getDisplay()来获取视图window所附加的Display 编辑 - 你可以使用View.bringToFront(); 或View.bringChildToFront(View child); 重新排序视图的 z-index。 回答3 myView.getDisplay()你可以使用这个方法来显示View。

2021-10-15 14:08:24    分类:技术分享    android   android-view   android-windowmanager   android-window

如何更改通过 WindowManager 添加的窗口的 z 顺序?(How to change the z-order of window added via WindowManager?)

问题 是否可以指定每个窗口的 z 顺序? 在下图中,每个 editText 都位于通过 WindowManager 添加的自己的窗口中。 正如你所看到的,我有一个 z 顺序问题 就像您在图片上看到的那样,最后一个窗口添加了接缝以采用更高的 z 顺序。 因此,我发现将窗口放在较高 z 顺序的唯一方法是从 windowManager 中删除视图,然后立即再次添加它。 这不是最佳解决方案,因为在视觉上视图消失并重新出现在屏幕上

2021-10-15 13:44:49    分类:技术分享    android   android-layout   android-view   android-windowmanager   android-layoutparams

在所有活动中保持 Android 相机打开(Keeping Android camera open across activities)

问题 我正在尝试打开 Android 摄像头,并使其在多个活动中不断在后台运行,以供 Glass 和非 Glass 设备的各种长时间运行的框架消费者使用。 这意味着我不能在一项活动停止时简单地关闭相机并在下一项活动开始时重新打开它; 它必须始终保持打开状态。 我尝试使用应用程序作为上下文(而不是活动)创建 SurfaceView,并将其直接添加到 WindowManager。 这确实让我保持相机打开,但只有当我将它添加为系统叠加层时,它才会呈现在实际活动的顶部并使它们无法使用。 我尝试过的其他事情不起作用: 使用 Activity 生命周期回调来查找出现的 Activity 并将其内容视图置于最前面(系统覆盖覆盖所有) 调用SetWillNotDraw(false)并覆盖自定义 SurfaceView 的OnDraw()以不实际渲染任何内容调用SetWillNotDraw(false)并覆盖自定义 SurfaceView 的OnDraw()以呈现覆盖屏幕的黑色矩形,包括不透明和透明打开相机后将预览大小设置为(1, 1)(仍然呈现全屏) 使用我的初始 Activity 作为上下文创建 SurfaceView 并将其添加到 WindowManager 作为具有无触摸标志的应用程序类型(即使在推回并消耗输入后仍呈现在顶部) 在WindowManager

2021-10-14 15:44:06    分类:技术分享    android   camera   google-glass   android-windowmanager

Android:ProgressDialog.show() WindowManager 令牌,无效(Android: ProgressDialog.show() WindowManager token, not valid)

问题 public class MainActivity extends Activity { private static String State = "STOP"; final String address = "http://XXXX.co.uk:9994"; private ImageView Player; private ProgressDialog progress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.activity_main); Button Schedule; Button Presenters; Button Image; Player = (ImageView) findViewById(R.id.imgStart); if(State != "STOP"){ Player.setImageResource(R

2021-10-14 14:58:22    分类:技术分享    android   progressdialog   android-windowmanager