【问题标题】:Android Activity transparent backgroundAndroid Activity 透明背景
【发布时间】:2016-12-02 00:59:21
【问题描述】:

我有一个很常见的要求。

我有一个 Activity 需要在移动设备上全屏显示(Size-Normal),并在平板设备上显示为一个对话框(Size-Large 和 Size-XLarge)。

在这两种格式中,我都在 Activity 的内容视图中显示 UI 小部件,例如 Horizo​​ntal-ProgressBar、Circular-ProgressBar 作为负载指示器等,它们需要遵循与 Custom 一致的 Material-Design - 品牌颜色等。我不能放弃这个要求。

我已经定义了基于默认 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 用作应用程序中所有活动的默认主题,并将 AppTheme.Dialog 用于上述特定活动,仅适用于平板电脑设备。 Activity 确实显示为位于平板电脑屏幕中心的 Floating-Dialog 窗口,在触摸外部时会像典型的 Dialog 一样消失,一切都很好,但问题是 Activity 的窗口背景就像漆黑一样。

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

如何实现这一点,而不必使用 Theme.Dialog 或 Theme.Translucent,正如我之前所说,我需要 UI-Widget 的 Material-Design 规范不要改变原来的“AppTheme”样式。

我还需要重用在 Activity 类中声明的大量自定义私有方法,因此绝对不推荐将内容视图布局文件加载到 Dialog 实例中。

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

【问题讨论】:

    标签: android dialog styles themes floating


    【解决方案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 builder 实际上不适合设计透明对话框,并且将始终具有黑色背景,这实际上是它的主题。

    For more refer this link

    【讨论】:

    • 正如我所提到的,我不想使用对话框实例。我希望 Activity 在大型和 XLarge 设备中显示为具有透明背景浮动窗口的对话框,但在普通和小型设备中显示为全屏窗口。此外,如果我开始使用特定于平板电脑设备的对话框实例,则需要重构大量点击功能和用户交互。
    【解决方案2】:

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

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

    【讨论】:

    • 我没有使用 Fragments。片段是一个糟糕的设计,它们是后处理的,这意味着片段生命周期在 Activity 的生命周期和 Activity 的内容视图绘制周期完成之后执行。至于透明主题背景,正如我之前提到的,我还有其他严格需要遵循指定的 Material-Design 样式指南的 UI-Widget,例如在 Theme.AppCompat 之间的外观明显不同的水平进度条。 NoActionBar、Theme.Dialog 和 Theme.Translucent。
    【解决方案3】:

    所以,我终于想通了。 我已将“AppTheme.Light”声明为 Android Manifest 中相同 Activity 的默认主题,因为它应该在移动设备中以白色不透明背景全屏显示,而相同的 Activity 应该显示为平板设备中的浮动对话框,因此我在 Activity 的生命周期内将主题“以编程方式”设置为 AppTheme.Dialog。

    我应该反过来做同样的事情。我应该在平板设备的 Android Manifest 文件中声明适用的主题,并在设备屏幕大小为 Normal 或 Small 时将所有这些 Floating-Dialog 属性重写为全屏布局模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 2011-08-08
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多