使用WindowManager.addView和WindowManager.LayoutParams,可以将视图添加到屏幕TYPE_SYSTEM_OVERLAY,然后将其绘制在所有其他应用程序之上.这可以用于各种效果,例如着色屏幕或绘制始终可见的视图.但是,我还没有找到一种方法让这个叠加层绘制在软键后面绘制的背景.
随着新的选项,以在由奇巧支持该地区借鉴,我想我可以尝试FLAG_TRANSLUCENT_NAVIGATION和FLAG_TRANSLUCENT_STATUS,但后台仍是禁区.FLAG_LAYOUT_IN_SCREEN和FLAG_FULLSCREEN似乎并没有帮助.似乎影响软键背景的唯一方法是使用FLAG_DIM_BEHIND和设置.dimAmount,但这只能用于调暗软键背景.是否有可能实际在那里绘制一些东西,它来自活动内部的方式?如果是这样,怎么办呢?
android android-layout android-windowmanager android-4.4-kitkat
我有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?
是否可以指定每个窗口的 z 顺序?在下图中,每个 editText 都位于通过 WindowManager 添加的自己的窗口中。正如你所看到的,我有一个 z 顺序问题
正如您在图片中看到的那样,最后一个窗口添加了接缝以采用更高的 z 顺序。因此,我发现将窗口放在较高 z 顺序的唯一方法是从 windowManager 中删除视图,然后立即再次添加它。这不是最佳解决方案,因为视觉上视图消失并重新出现在屏幕上
android android-layout android-view android-windowmanager android-layoutparams
我正在创建一个 Android 应用程序,其中使用服务和窗口管理器在所有应用程序之上显示浮动视图。我正在尝试在窗口管理器参数中添加 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 以使我的布局能够与显示切口重叠。但这似乎不适用于我的情况。
我已经尝试过以两种方式添加它:
通过使用 XML 样式:
<style name="OverlayTheme">
<item name="android:windowLayoutInDisplayCutoutMode">
shortEdges <!-- default, shortEdges, never -->
</item>
</style>
Run Code Online (Sandbox Code Playgroud)
并在我的布局根视图中添加了此样式。但这不起作用。
通过在我的服务中使用 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)
它也不起作用。我不确定我是否正确应用了布局参数。请帮我找出问题所在。提前致谢。
编辑:
这是我在服务中实现气泡的方式:
在 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)通过窗口管理器将此视图添加到窗口:
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)最后通过 addView …
android android-service android-layout android-windowmanager display-cutouts
我上传了一个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.这似乎可能是错误.我宁愿不改变它,因为它需要我有两个窗口而不是一个.提前致谢!
我正在编写一个应用程序,在弹出窗口中显示未接来电和未读短信.它还有一个提醒功能(关闭弹出窗口并在指定时间后打开它).它类似于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%的窗口,但能够同时滚动它下面的窗口(并在其上执行点击事件).
所以我的问题是:
我有一个注册加速度计的服务.当识别出某些摇动模式时,服务使用此代码启动一个活动.
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
我的应用程序界面作为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) 我有一个奇怪的问题.我收到了这份崩溃报告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) 我正在添加一个TextView具有属性的浮动窗口android:textisselectable.
mWindowManager.addView(textView, params);
Run Code Online (Sandbox Code Playgroud)
Eveything工作正常,但我无法在长按时复制文本.奇怪的是,它在Galaxy Tab中运行良好,但在我拥有的任何其他5英寸手机上都没有.