问题
如何以编程方式(不触及 AndroidManifext.xml
)设置 Activity
的主题 so that it looks like a dialog ?
注意:我可以修改 AndroidManifext.xml
,只要它不需要修改就可以在正常 Activity 或对话框之间切换。
到目前为止我尝试了什么
我根据 this stackoverflow answer 尝试了以下操作:
public class DialogActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
setTheme(android.R.style.Theme_DeviceDefault_Dialog);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
Log.d(TAG,"Build.VERSION.SDK_INT: "+Build.VERSION.SDK_INT); // 23
}
}
但它最终是blacking out everything in the background .
我还看到了this stackoverflow answer ,并尝试:
public class DialogActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
setTheme(android.R.style.Theme_DeviceDefault_Dialog);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
}
}
但最终生成了 everything black .
做什么?谢谢。
最佳答案
背景
如果前台 Activity 的主题根据其AndroidManifest.xml
是一个对话框,则在Activity
后面绘制Activity
;否则 android 操作系统将不在它后面绘制Activity
(可能是为了节省内存,因为它通常不会被看到)。
为了利用这一点,我们将 Acitvity
的主题设置为 list 中的一个对话框,让 android 操作系统在它后面绘制 Activity
,但后来以编程方式设置我们的 Activity
的主题可以在运行时随心所欲。
Example on github
I made an example and put it on github.
教程
第 1 步:在 styles.xml
中为您的应用程序创建两个自定义主题。一个用于正常 Activity ,另一个用于对话 Activity 。自定义对话框主题继承自也是对话框的基本主题很重要。在我的例子中,父主题是 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
是一个dialog,所以它会绘制它后面的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 步:在实际 Activity 中,以编程方式将主题设置为正常 Activity 的主题或对话的主题。我的 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);
}
}
关于java - 如何以编程方式将 Activity 主题化为对话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834481/