Android Activity透明背景

Android Activity transparent background

我有一个很常见的要求。

我有一个 Activity 需要在移动设备上全屏显示(正常大小),并在平板设备上显示为对话框(大号和特大号)。

在这两种格式中,我都在 Activity 的内容视图中显示了 UI-Widget,例如作为加载指示器的 Horizo​​ntal-ProgressBar、Circular-ProgressBar 等,需要遵循一致的 Material-使用自定义品牌颜色等进行设计。我不能放弃这个要求。

我已经根据默认 Android 主题和样式定义了自定义样式,并在整个应用程序中为所有活动使用它们。以下是自定义主题。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:colorPrimary" tools:ignore="NewApi">
        @color/light_black
    </item>
    <item name="colorPrimary">@color/light_black</item>
    <item name="android:colorAccent" tools:ignore="NewApi">@color/sapphire</item>
    <item name="colorAccent">@color/sapphire</item>
    <item name="android:colorBackground">@color/primary_background</item>
    <item name="android:textColorPrimary">@color/title_color</item>
    <item name="android:colorButtonNormal" tools:ignore="NewApi">@color/sapphire</item>
    <item name="colorButtonNormal">@color/sapphire</item>
    <item name="android:colorForeground" tools:ignore="NewApi">
        @color/title_color
    </item>
    <item name="android:titleTextStyle">@style/toolbar_title</item>
    <item name="android:navigationIcon" tools:ignore="NewApi">?android:attr/homeAsUpIndicator</item>
    <item name="navigationIcon">?android:attr/homeAsUpIndicator</item>
    <item name="android:colorControlNormal" tools:ignore="NewApi">@color/white</item>
    <item name="colorControlNormal">@color/white</item>
</style>

<style name="AppTheme.Light" parent="AppTheme">
    <item name="android:windowBackground">@color/white</item>
</style>

<style name="AppTheme.Dialog" parent="AppTheme.Light">
    <item name="android:windowBackgroundFallback" tools:ignore="NewApi">
        @android:color/transparent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundFloating" tools:ignore="NewApi">
        @android:color/transparent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">false</item>
    <item name="windowActionModeOverlay">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowClipToOutline" tools:ignore="NewApi">false</item>
    <item name="android:windowTitleStyle">@null</item>
    <item name="android:windowTitleBackgroundStyle">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:windowEnableSplitTouch">true</item>
    <item name="android:fitsSystemWindows">true</item>
    <item name="android:fillViewport">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:backgroundDimAmount">0.2</item>
</style>

我使用 AppTheme 作为应用程序中所有 Activity 的默认主题,AppTheme.Dialog 用于上述特定 Activity 仅适用于平板电脑设备。 Activity 确实显示为平板电脑屏幕中心的浮动对话框 window,像典型的对话框一样在外部触摸时消失,一切都很好,但问题是 Activity 的window-背景像漆黑一样。

我的要求是 Activity 作为平板设备中的浮动对话框应该有一个透明背景,展示之前的 activity window-内容可能变暗和变暗。

如何实现这一点,而不必使用 Theme.Dialog 或 Theme.Translucent,正如我之前所说,我需要 Material-UI 的设计规范- 小部件不会改变原来的 "AppTheme" 样式。

我还需要重新使用 Activity class 中声明的许多自定义私有方法,因此将内容视图布局文件加载到 Dialog 实例中绝对不是首选。

哦,顺便说一句,compileSdkVersion 是最新的 24,minSdkVersion 是 16,targetSdkVersion 是 24,buildToolsVersion 也是最新的 24.0.1,但这完全是一个不同的问题。

使用Dialog创建透明主题。

样本:

Dialog alertDialog = new Dialog(this);
alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
alertDialog.setContentView(R.layout.tabs);
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
alertDialog.show();

注意:AlertDialog 生成器实际上不适合设计透明对话框,并且将始终具有黑色背景,这实际上是它的主题。

For more refer this link

如果您使用的是Fragments,那么请记住不要替换新的fragment,而是将其添加到之前的fragment之上,并将背景颜色定义为透明的主题。

如果您正在使用活动,只需为您正在使用的 activity 或对话框使用透明主题背景。

所以,我终于想通了。 我已将 "AppTheme.Light" 声明为 Android 清单中相同 Activity 的默认主题,因为它应该在移动设备中以白色不透明背景全屏显示,而同样的 Activity 应该在平板电脑设备中显示为浮动对话框,所以我在 Activity 的生命周期内将主题 'Programmatically' 设置为 AppTheme.Dialog。

我应该反过来做同样的事情。我应该在平板设备的 Android 清单文件中声明适用的主题,并在设备屏幕尺寸为普通或小尺寸时将所有这些浮动对话框属性重写为全屏布局模式。