覆盖由主题设置的活动背景

时间:2015-12-09 00:48:17

标签: android android-activity android-alertdialog android-theme android-styles

我目前在启动画面上有一个活动。以下是我将主题应用于活动的方式:

<application
    ...

    <activity
        android:name=".activities.SplashActivity"
        android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

SplashTheme定义如下:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:background">@drawable/splash_background</item>
</style>

splash_backround.xml定义如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <bitmap
        android:src="@drawable/login_background"
        android:tileMode="disabled" />
</item>
<item>
    <bitmap
        android:src="@drawable/login_siren"
        android:tileMode="disabled"
        android:gravity="bottom|center_horizontal" />
</item>
<item android:top="120dp">
    <bitmap
        android:src="@drawable/splash_welcome"
        android:tileMode="disabled"
        android:gravity="top|center_horizontal" />
</item>

我没有在我的SplashActivity类的onCreate()中调用setContentView(),因此显示的内容是SplashTheme设置的内容。

如果在Application.onCreate()上无法加载某些内容,我想要显示AlertDialog的情况已经出现。当我使用它来构建,创建和显示AlertDialog时,会显示启动画面。但是,当我显示AlertDialog时,它会从Activity的主题中分配背景。即使我为AlertDialog(通过android:alertDialogTheme或android:alertDialogStyle)定义了一个明确定义不同背景的自定义样式,它也会被活动定义的背景所推翻。结果,我将SplashTheme更改为以下内容:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_background</item>
</style>

这现在释放了对警报对话框背景的控制,因为我没有在我的Activity主题中明确设置android:background。但是,窗口背景不考虑状态栏(即背景也适用于状态栏下方)。因此,当启动画面转换到在其布局中使用相同背景的下一个活动时(由于考虑了状态栏),我得到了一些跳跃。所以,这个解决方案仍然没有按照我的意愿运作。

如果我使用原始的SplashTheme(我在其中定义android:background),有没有办法覆盖主题定义的android:后台的AlertDialog?

1 个答案:

答案 0 :(得分:0)

应用后,无法更改活动主题。

  

有没有办法覆盖主题为android:background定义的AlertDialog

AlertDialog有一个构造函数,它接受themeResId作为输入。来自docs of AlertDialog (Context context, int themeResId)

  

创建一个使用显式主题资源的警告对话框。

创建自定义主题,覆盖android:background属性,然后使用新创建的主题创建AlertDialog

Dialog dialog = new AlertDialog(context, R.style.my_dialog_theme);