Android:更改WindowManager添加的View的LayoutParams

15

我有一个由WindowManager管理的覆盖在上面的View,就像这个问题中一样。

简单来说,它看起来像这样:

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
my_view_layout_params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
       PixelFormat.TRANSLUCENT);

wm.addView(my_view, my_view_layout_params);

它可以工作,但如果我需要更改布局参数,我需要删除View并重新添加它,像这样:

wm.removeView(my_view);
wm.addView(my_view, my_view_layout_params);

看起来不太好看。我尝试过my_view.setLayoutParams(my_view_layout_params),但不幸地它没有生效。我该怎么做呢?


你可不可以不使用 view.getLayoutParams() 方法,而是直接更新返回的 LayoutParams 对象,然后调用 view.requestLayout() 方法? - Reuben Scratton
Reuben,谢谢您的回复,但不幸的是它并没有起作用。我执行了 view.getLayoutParams(),然后更改了返回的 LayoutParams 的 gravity,执行了 view.requestLayout(),但什么也没变。 - Dmitry Frank
1
WindowManager有一个updateViewLayout()成员函数...这肯定是你想要的,对吧? - Reuben Scratton
哦,我很惊讶为什么我自己错过了它!谢谢。你可以把同样的话写成答案,我会接受它。 - Dmitry Frank
2个回答

17

WindowManager有一个updateViewLayout()成员函数…这就是你想要的东西了吧?

windowManager.updateViewLayout(my_view, my_view_layout_params);

1
这个方法很有帮助,但要小心,因为一些属性(如窗口类型)一旦设置就无法更改,如果尝试更改会导致FC。 - Tom
是的,这个方法可行。不需要使用 setLayoutParams。谢谢! - George Pligoropoulos

5
您可以使用以下内容:
wm.updateViewLayout(my_view,my_view_layout_params);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接