【发布时间】:2016-12-02 00:59:21
【问题描述】:
我有一个很常见的要求。
我有一个 Activity 需要在移动设备上全屏显示(Size-Normal),并在平板设备上显示为一个对话框(Size-Large 和 Size-XLarge)。
在这两种格式中,我都在 Activity 的内容视图中显示 UI 小部件,例如 Horizontal-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