背景
在
Activity后面的
Acivity绘制,如果根据其前景活动的主题
AndroidManifest.xml是对话;
否则,Android操作系统将 不会 在其
Activity后面绘制(可能是为了节省内存,因为通常无论如何都不会看到它)。
为了利用这一点,我们将
Acitvity清单的主题设置为清单中的对话框,以使android
os在其
Activity后方进行绘制,但随后,以编程方式将
Activity的主题设置为运行时所需的主题。
github上的例子
我做了一个例子,并将其放在github上。
讲解
步骤1:
在中为您的应用程序创建两个自定义主题
styles.xml。一个用于正常活动,另一个用于对话活动。自定义对话框主题必须从也是对话框的基本主题继承,这一点很重要。在我的情况下,父主题为
base.Theme.AppCompat.Light.Dialog.FixedSize。这是我的
styles.xml:
<resources> <!-- custom normal activity theme --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> </style> <!-- custom dialog activity theme --> <style name="AppTheme.Dialog" parent="base.Theme.AppCompat.Light.Dialog.FixedSize"> <!-- removing the dialog's action bar --> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style></resources>
步骤2: 在中
AndroidManifest.xml,将相关主题设置
Activity为任何对话框主题。这使android
os认为
Activity对话框是一个对话框,因此它将在对话框
Activity后面绘制,而不是将其涂黑。就我而言,我使用
Theme.AppCompat.Dialog。以下是我的
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.eric.questiondialog_artifact"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <activity android:name=".DialogActivity" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Dialog"> <-- importANT!!! --> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application></manifest>
步骤3: 在实际活动中,以编程方式将主题设置为常规活动的主题或对话框的主题。我
DialogActivity.java的如下:
package com.example.eric.questiondialog_artifact;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;public class DialogActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme_Dialog); // can either use R.style.AppTheme_Dialog or R.style.AppTheme as deined in styles.xml super.onCreate(savedInstanceState); setContentView(R.layout.activity_dialog); }}


