我希望能够创建活动,始终是在Android系统显示前面。 应该没有收到输入,只是把它传递到任何应用程序旁边下方。 有点像HUD。
我可以研究,我需要设置下面的窗口类型TYPE_SYSTEM_ALERT但它看起来像Android这样无视我的代码 - 也不例外,即使我删除清单android.permission.SYSTEM_ALERT_WINDOW许可抛出。 (它是需要使用此窗口类型)。 当我试图在对话框中使用的警报类型,它的工作好,但我不能让对话为全屏幕透明的实体。 这里是我的代码,也许有一些简单的缺失。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.main);
}
半透明的设置,必须在外部XML清单功能,否则它也没有工作。
<item name="android:windowIsTranslucent">true</item>
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null);
getWindow().setAttributes(params);
wm.addView(mTopView, params);
我发现, 公认的答案(由tmouse)并没有完全为我工作。 也许它的工作对旧的API级别? 我使用API级24。
这个特别的答案曾建议:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
);
有一个问题与此有关。 存在的构造WindowManager.LayoutParams
如下:
所以WindowManager.LayoutParams.FLAG_FULLSCREEN
标志被用来作为一个明确的价值int w
和int h
。 这是没有好! 您的视图的尺寸被置为1024 * 1024 -所以它不会填满整个屏幕。 而且,即使你明确地设置布局的宽度和高度来匹配设备的尺寸:当屏幕方向改变,他们将不会更新。 我们需要一种不同的方法...
我发现, 正确的施工全屏幕重叠是像这样:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN,
PixelFormat.TRANSLUCENT
);
这意味着我们不再明确指定的宽度和高度。 布局完全依赖于我们的标志来代替。
是的, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
是一个必需的标志依然; 如果你想装饰画对诸如状态栏是必要的。
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
应当被用来代替TYPE_SYSTEM_ALERT
在API级别> = 19。 这是一个注解我写的前一阵子,可惜我已经无法找到引用来证实为什么我认为,所以采取与少许盐。
奖金注释(如果你正在读这篇文章,你可能试图使一个全屏叠加):
你的清单将需要这些权限(说明这里 ):
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
我的理解是, SYSTEM_ALERT_WINDOW
是实际所需的权限,但ACTION_MANAGE_OVERLAY_PERMISSION
需要也:它可以让你在运行时,用户同意请求SYSTEM_ALERT_WINDOW
特权。
我公司提供在这里的源代码,我的工作API级别24的应用程序,创建了一个全屏幕重叠。
看看这个
提到它在AndroidManifest.xml档案
<activity android:name=".MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
如果你想使你的活动在全屏幕和透明也
看看这个
<activity android:name=".MyActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />