Как создать прозрачную активность БЕЗ окнаIsFloating - PullRequest
18 голосов
/ 25 октября 2011

windowIsFloating в то время как отличный универсальный магазин для создания Dialog стилизованных интерфейсов имеет много --- ошибки --- причуды.

То, с чем я сейчас борюсь, это то, что он назначил ширину / высоту верхнего предка как "wrap_content ", а не ширину / высоту экрана. Это означает обычный дизайн пользовательского интерфейса с использованием "match_parents" будет распространяться вверх, чтобы стать "wrap_content". Плохие времена.

Итак, что я действительно хотел бы, это создать действие и иметь такой макет:

<LinearLayout   android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:orientation="vertical"
                android:id="@+id/containerPageConatiner"
                android:background="@drawable/windowBackground">
    <View           android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"/>
    <FrameLayout    android:id="@+id/singlePane"
                    android:layout_height="wrap_content"
                    android:layout_width="match_parent"
                    android:layout_gravity="center_horizontal|center_vertical"
                    android:padding="10dp"/>    
    <View           android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"/>                         
</LinearLayout> 

, который создает пользовательский интерфейс, показывающий одно окно (@ id / singlePane) поверх действия, которое его вызвало.

У кого-нибудь есть просто правильный набор стилей, необходимый для создания прозрачного фона Упражнение?

Ответы [ 3 ]

30 голосов
/ 25 октября 2011

Спасибо @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, а не корневому представлению макета.

8 голосов
/ 25 октября 2011

используйте как это для действия в файле манифеста (тема представляет прозрачность этого действия.)

<activity android:name=".Settings"      
          android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
0 голосов
/ 27 июля 2016

Принятый ответ работает нормально, пока мне не понадобится EditText внутри окна стиля диалога, так как мягкая клавиатура IME не будет поднимать "диалог" без windowIsFloating.Поэтому я должен заняться «ошибкой» в лоб.

Как и в случае с вопросом, мне нужно установить ширину "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(); в соответствующем месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...