标签: android-windowmanager

在Android KitKat上,覆盖视图是否可以填满整个屏幕?

使用WindowManager.addViewWindowManager.LayoutParams,可以将视图添加到屏幕TYPE_SYSTEM_OVERLAY,然后将其绘制在所有其他应用程序之上.这可以用于各种效果,例如着色屏幕或绘制始终可见的视图.但是,我还没有找到一种方法让这个叠加层绘制在软键后面绘制的背景.

随着新的选项,以在由奇巧支持该地区借鉴,我想我可以尝试FLAG_TRANSLUCENT_NAVIGATIONFLAG_TRANSLUCENT_STATUS,但后台仍是禁区.FLAG_LAYOUT_IN_SCREENFLAG_FULLSCREEN似乎并没有帮助.似乎影响软键背景的唯一方法是使用FLAG_DIM_BEHIND和设置.dimAmount,但这只能用于调暗软键背景.是否有可能实际在那里绘制一些东西,它来自活动内部的方式?如果是这样,怎么办呢?

android android-layout android-windowmanager android-4.4-kitkat

6
推荐指数
0
解决办法
591
查看次数

在运行时移除 FLAG_TRANSLUCENT_STATUS

我有MainActivity很多Fragments 并且在一个特定的片段中我想在系统栏后面绘制,所以我在运行时应用以下标志:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
Run Code Online (Sandbox Code Playgroud)

我现在想要的是当用户退出Fragment并输入另一个以删除该标志时,状态栏后面没有内容。我尝试将 null 作为参数传递给setFlags()方法,但这给出了错误。我已经搜索remove()unSet()方法,但不存在。那么我应该如何删除另一个标志Fragment

java flags android android-windowmanager android-window

6
推荐指数
1
解决办法
3821
查看次数

如何更改通过 WindowManager 添加的窗口的 z 顺序?

是否可以指定每个窗口的 z 顺序?在下图中,每个 editText 都位于通过 WindowManager 添加的自己的窗口中。正如你所看到的,我有一个 z 顺序问题

在此输入图像描述

正如您在图片中看到的那样,最后一个窗口添加了接缝以采用更高的 z 顺序。因此,我发现将窗口放在较高 z 顺序的唯一方法是从 windowManager 中删除视图,然后立即再次添加它。这不是最佳解决方案,因为视觉上视图消失并重新出现在屏幕上

android android-layout android-view android-windowmanager android-layoutparams

6
推荐指数
0
解决办法
2294
查看次数

如何在窗口管理器参数中添加LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES?

我正在创建一个 Android 应用程序,其中使用服务和窗口管理器在所有应用程序之上显示浮动视图。我正在尝试在窗口管理器参数中添加 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 以使我的布局能够与显示切口重叠。但这似乎不适用于我的情况。

我已经尝试过以两种方式添加它:

  1. 通过使用 XML 样式:

    <style name="OverlayTheme">
      <item name="android:windowLayoutInDisplayCutoutMode">
        shortEdges <!-- default, shortEdges, never -->
      </item>
    </style>
    
    Run Code Online (Sandbox Code Playgroud)

    并在我的布局根视图中添加了此样式。但这不起作用。

  2. 通过在我的服务中使用 JAVA 代码:

    params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.MATCH_PARENT,
                        WindowManager.LayoutParams.MATCH_PARENT,
                        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                                | WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
                                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                        PixelFormat.TRANSLUCENT);
    
    Run Code Online (Sandbox Code Playgroud)

    它也不起作用。我不确定我是否正确应用了布局参数。请帮我找出问题所在。提前致谢。

编辑:

这是我在服务中实现气泡的方式:

  1. 在 onCreate() 方法中初始化窗口管理器和布局:

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (inflater != null)  mLayout = inflater.inflate(R.layout.my_layout, null, false); 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过窗口管理器将此视图添加到窗口:

    WindowManager.LayoutParams params;
    params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.MATCH_PARENT,
                        WindowManager.LayoutParams.MATCH_PARENT,
                        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                                | WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
                                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                        PixelFormat.TRANSLUCENT);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后通过 addView …

android android-service android-layout android-windowmanager display-cutouts

6
推荐指数
1
解决办法
2998
查看次数

Android Crash,java.lang.IllegalArgumentException:添加窗口后无法更改窗口类型

我上传了一个Android应用程序到市场,由于某种原因,用户收到此错误.

java.lang.IllegalArgumentException: Window type can not be changed after the window is added.
at android.os.Parcel.readException(Parcel.java:1331)
at android.os.Parcel.readException(Parcel.java:1281)
at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:664)
at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:3594)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1193)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2450)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4444)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我很确定我从未WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG在其他帖子中引用过.但是,我有一个在WindowManager.LayoutParams.TYPE_PHONE和之间切换的窗口WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY.这似乎可能是错误.我宁愿不改变它,因为它需要我有两个窗口而不是一个.提前致谢!

android android-windowmanager

5
推荐指数
1
解决办法
6971
查看次数

像any.do一样的弹出窗口

我正在编写一个应用程序,在弹出窗口中显示未接来电和未读短信.它还有一个提醒功能(关闭弹出窗口并在指定时间后打开它).它类似于any.do的弹出窗口.

我能够通过使用WindowManger创建这样一个窗口,但由于某些我目前尚不理解的原因,弹出窗口在一段时间后消失(虽然它应该被打开,直到用户关闭它,或点击提醒按钮)这可能需要几个小时).

这就是我创建现有弹出窗口的方式

windowManager = (WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE);              
    this.inflater = LayoutInflater.from(context);
    params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.BOTTOM;
    vgPopupWindow = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.popup_mainwindow, null);
    vgPopupContent = (ViewFlipper) vgPopupWindow.findViewById(R.id.popup_content);
    vgPopupAreaContent = (ViewGroup) vgPopupWindow.findViewById(R.id.popup_area_content);
    vgPopupAreaActions = (ViewGroup) vgPopupWindow.findViewById(R.id.popup_area_actions);
    vgPopupTabs = (LinearLayout) vgPopupWindow.findViewById(R.id.popup_tabs);
    vgPopupHeader = (LinearLayout) vgPopupWindow.findViewById(R.id.popup_main_header);
    windowManager.addView(vgPopupWindow, params);
Run Code Online (Sandbox Code Playgroud)

因为我不确定WindowManager是否真的是正确的方式,我也尝试对以下风格的活动做同样的事情

<style name="PopupWindow" parent="CustomTheme">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">false</item>
    <item name="android:windowIsTranslucent">true</item>
Run Code Online (Sandbox Code Playgroud)

它的外观现在就像WindowManager版本一样,但有一个问题:我无法访问它下面的应用程序窗口,因为窗口的半透明部分看起来很完美,但阻止任何点击事件到下面的窗口,这样我就可以不滚动它或做任何事情.就像在any.do中我只想要显示那个窗口,但是当弹出窗口打开时不阻止任何可能在下面的窗口上工作.

编辑:我想看到底部的弹出窗口,覆盖30%的窗口,但能够同时滚动它下面的窗口(并在其上执行点击事件).

所以我的问题是:

  1. WindowManager是创建这个弹出窗口的正确方法吗?
  2. 如果是的话,为什么它有时会消失?我怎么能阻止它?
  3. 如果不是,我如何创建一个活动,就像我使用WindowManager创建的窗口一样?
  4. 或两者都错了?在这种情况下; 什么是正确的方式?

android android-intent android-layout android-windowmanager

5
推荐指数
1
解决办法
1089
查看次数

FLAG_TURN_SCREEN_ON不起作用

我有一个注册加速度计的服务.当识别出某些摇动模式时,服务使用此代码启动一个活动.

Intent launchIntent = new Intent("my.package.MAIN_ACTIVITY");
LaunchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(LaunchIntent);
Run Code Online (Sandbox Code Playgroud)

onCreate我使用此代码段来解锁手机并打开屏幕:

Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON|
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)

如果用户有时不与活动交互,我会使用此代码启用显示关闭:

Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)

如果在显示活动时显示屏关闭并且电话锁定,并且我重复摇动模式,onStart则调用该方法.我尝试将相同的代码用于打开和解锁,如上所述,但它不起作用(显示未打开).

可能是什么问题呢?

android android-intent android-windowmanager android-activity

5
推荐指数
1
解决办法
3660
查看次数

Android WindowManager错误:未调用DispatchAttachedToWindow

我的应用程序界面作为Facebook聊天,所以我使用覆盖按钮.我在主要活动中使用了意向服务.我在FloatBitchService中创建了chathead ui.使用WindowManager创建UI.将float_view布局添加到WindowManager.在float_view布局中,除了butHead之外,所有控件都可见.但头部是叠加按钮.我想显示ovelay按钮单击显示其他控件.我使用onTouchevent上的覆盖按钮进行叠加按钮单击.我的错误发生在输入文本框控件中.调试设备是三星Galaxy Note 2.

更新
在Samsung Note 2 Android 4.3中,在输入文本框发短信后按Enter键显示谷歌搜索应用程序.我的应用与谷歌搜索应用程序有什么问题.

(FloatBitchService.java)

public class FloatBitchService extends Service {
@Override
public void onCreate() {
    windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    LayoutInflater inflater = LayoutInflater.from(this);        
    viewFloat = inflater.inflate(R.layout.float_view, null);
    butHead = (Button)viewFloat.findViewById(R.id.butHead);
    ...........................
    parameters = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT, // Width
            WindowManager.LayoutParams.WRAP_CONTENT, // Height
            WindowManager.LayoutParams.TYPE_PHONE, // Type
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,// Flag             
            PixelFormat.TRANSLUCENT // Format)
            );      
    parameters.x = 0;
    parameters.y = 0;
    parameters.gravity = Gravity.TOP | Gravity.LEFT;        
    windowManager.addView(viewFloat, parameters);
    butHead.setOnTouchListener(new OnTouchListener() {

        int initialX, initialY;
        float initialTouchX, initialTouchY;

        @Override …
Run Code Online (Sandbox Code Playgroud)

android native dispatch intentservice android-windowmanager

5
推荐指数
0
解决办法
1029
查看次数

android.view.WindowManager $ BadTokenException

我有一个奇怪的问题.我收到了这份崩溃报告Crashlyitics.这似乎没有显示我的活动代码的任何行.所以我不知道这个错误何时发生.任何人都知道这个例外何时发生.任何可能的情况?

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:692)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:345)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
       at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
       at android.view.Window$LocalWindowManager.addView(Window.java:556)
       at android.widget.MediaController.show(MediaController.java:338)
       at android.webkit.HTML5VideoFullScreen.showControllerInFullScreen(HTML5VideoFullScreen.java:386)
       at android.webkit.HTML5VideoViewProxy$VideoPlayer.end(HTML5VideoViewProxy.java:311)
       at android.webkit.HTML5VideoViewProxy.handleMessage(HTML5VideoViewProxy.java:432)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4895)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
       at dalvik.system.NativeStart.main(NativeStart.java)
Run Code Online (Sandbox Code Playgroud)

android android-webview android-windowmanager

5
推荐指数
1
解决办法
842
查看次数

android:textisselectable在TYPE_SYSTEM_ALERT窗口中不起作用

我正在添加一个TextView具有属性的浮动窗口android:textisselectable.

mWindowManager.addView(textView, params);
Run Code Online (Sandbox Code Playgroud)

Eveything工作正常,但我无法在长按时复制文本.奇怪的是,它在Galaxy Tab中运行良好,但在我拥有的任何其他5英寸手机上都没有.

android textview android-view android-windowmanager

5
推荐指数
1
解决办法
336
查看次数