windowIsFloating
虽然创建Dialog
样式用户界面的一站式服务有很多
---臭虫---怪癖。
我现在正在努力的是它将顶部祖先的宽度/高度指定为"wrap_content
“而不是屏幕的宽度/高度。这意味着使用{的常用UI设计{1}}会向上传播成为"match_parents"
。不好的时候。
所以,我真正想要的是创建一个活动,并有一个这样的布局:
"wrap_content"
这会生成一个UI,显示调用它的Activity上面的单个窗口(@ id / singlePane)。
是否有人拥有创建透明背景活动所需的恰到好处的样式集?
答案 0 :(得分:29)
感谢@PolamReddy,我想要回答我的想法:
主题Theme.Translucent.NoTitleBar.Fullscreen
及其祖先包含创建半透明窗口所需的所有属性。为了得到与windowIsFloating
不同的东西,我经历了祖先堆栈并取出了整个属性集:
<style name="Theme.CustomTheme.TransparentActivity">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowFullscreen">true</item>
</style>
此样式必须分配到Activity
中的AndroidManifest.xml
,而不是布局的根视图。
答案 1 :(得分:7)
在清单文件中使用这样的活动(主题代表该活动的透明度。)
<activity android:name=".Settings"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
答案 2 :(得分:0)
接受的答案很好,直到我需要在对话框式窗口中有一个EditText,因为软IME键盘不会在没有windowIsFloating
的情况下推动“对话框”。所以我必须正面解决'bug'。
与问题中的情况一样,我需要将宽度设置为"match_parent"
,而高度可以保持"wrap_content"
。使用windowIsFloating
,我最终设置ViewTreeObserver
,在布局期间遍历视图树,并强制浮动窗口达到所需的宽度。方法如下(在活动的onCreate()
下) -
setContentView(contentView);
// set up the ViewTreeObserver
ViewTreeObserver vto = contentView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
int displayWidth = -1;
DisplayMetrics metrics = null;
View containerView = null;
@Override
public void onGlobalLayout() {
if (containerView == null) {
// traverse up the view tree
ViewParent v = contentView.getParent();
containerView = contentView;
while ((v != null) && (v instanceof View)) {
containerView = (View) v;
v = v.getParent();
}
}
if (metrics == null) {
metrics = new DisplayMetrics();
}
Display display = getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
if (displayWidth != metrics.widthPixels) {
displayWidth = metrics.widthPixels;
WindowManager.LayoutParams params =
(WindowManager.LayoutParams) containerView.getLayoutParams();
// set the width to the available width to emulate match_parent
params.width = displayWidth;
// windowIsFloating may also dim the background
// do this if dimming is not desired
params.dimAmount = 0f;
containerView.setLayoutParams(params);
getWindowManager().updateViewLayout(containerView, params);
}
}
});
到目前为止,这适用于Android 7(即使在分屏模式下),但是如果将来的实现发生变化,可以捕获可能的强制转换异常,以便转换为WindowManager.LayoutParams
,并添加removeOnGlobalLayoutListener();
适当的地方。