如何使用windowIsFloating创建透明活动

时间:2011-10-25 11:01:07

标签: android android-layout

windowIsFloating虽然创建Dialog样式用户界面的一站式服务有很多 ---臭虫---怪癖。

我现在正在努力的是它将顶部祖先的宽度/高度指定为"wrap_content“而不是屏幕的宽度/高度。这意味着使用{的常用UI设计{1}}会向上传播成为"match_parents"。不好的时候。

所以,我真正想要的是创建一个活动,并有一个这样的布局:

"wrap_content"

这会生成一个UI,显示调用它的Activity上面的单个窗口(@ id / singlePane)。

是否有人拥有创建透明背景活动所需的恰到好处的样式集?

3 个答案:

答案 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();适当的地方。