Android:如何以编程方式将Activity的主题设置为Theme.Dialog

所以我有一个Activity (比如说TestActivity ),它需要作为一个普通的不受欢迎的Activity以及其他地方的Theme.Dialog 。 我正在尝试为这两个任务重复使用相同的TestActivity

我正在寻找dynamic设置主题。 代码很简单:这是我的活动的onCreate与黑色背景

 public void onCreate(Bundle icicle) { if (Utility.isDialog == true) setTheme(android.R.style.Theme_Dialog); super.onCreate(icicle); requestWindowFeature(Window.FEATURE_NO_TITLE); ..... 

这里是清单条目

 <activity android:name=".TestActivity"/> 

与此同时,我发现一个post说这是不能做的是http://code.google.com/p/android/issues/detail?id=4394 。但是有一种强烈的感觉,可以做到。

所有的build议都欢迎。

想解决这个问题。

问题:如何使用基于对话框和全屏的相同的活动。

解答:

  1. 使用主题@android:style/Theme.Dialog在AndroidManifest.xml中定义您的活动
  2. 在各自的.Java文件中,检查定义dialog模式的intent附加。
  3. 如果它不存在,请将Theme设置为android.R.style.Theme 。 如果你没有定义任何主题,这是应用的默认主题。

代码:

 boolean fDialogMode = getIntent().hasExtra("dialog_mode"); if( ! fDialogMode ) { super.setTheme(android.R.style.Theme); } 

备用解决scheme:

更复杂的解决scheme是使用AlertDialog ,如下所示:

  1. 定义从ArrayAdapter扩展的ListAdapter类。
  2. getCount函数中返回1

     @Override public int getCount() { return 1; } 
  3. getView函数中, inflate你需要的activitylayout ,并在返回view之前进行任何定制。

     @Override public View getView( int position, View view, ViewGroup group ) { View v = view; if( v == null ) { v = getSystemService(Context.LAYOUT_INFLATER_SERVICE).inflate( <layout res id>, null ); } ... Do any customization here .... return v; } 

这绝对是第二个select,如果你没有在activity class做太多的处理,这可能是一个选项。

只有理由考虑这个解决scheme可能是,在dialog显示它的逻辑被隔离到它被用作对话框的地方。

这两个选项都适用于我,但由于显而易见的原因,我正在采取第一种select。 🙂

你可以在调用setContentView(...)super.oncreate()之前使用setTheme(..) super.oncreate() ,它应该可以正常工作

在调用setContentView()之前,调用onCreate() Activity.setTheme() setContentView()

像其他几个人一样,在onCreate中调用setTheme(在我调用super.onCreate之前或之后)都不起作用。 但是,通过覆盖setTheme,我能够指定除Manifest.xml中所述之外的主题。 具体而言,以下工作没有问题:

 @Override public void setTheme(int resid) { boolean changeTheme = true; super.setTheme(changeTheme ? android.R.style.Theme_Dialog : resid); } 

我在以下讨论中find了上述内容: https : //code.google.com/p/android/issues/detail?id=4394

在调用super.onCreate(savedInstance)之前使用setTheme

这可能不适用于您的情况,但您可以使用以下主题:

 Theme.Holo.DialogWhenLarge 

当屏幕较大时,它会将您的活动显示为对话框,而在屏幕较小时则显示为常规活动。 这在对话框的Android文档中有所介绍,并且还包含有关编程Dialog的信息,该对话框也可以作为全屏幕片段。

默认主题库调用:

 super.setTheme(android.R.style.Theme); 

在我的情况下,我正在使用AppCompat主题,所以请确保您的ID您引用适当的库(即):

super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);

setTheme(android.R.style.Theme_Dialog);

我知道我迟到了,但我想在这里发布一个解决scheme:

检查完整的源代码在这里 。 这是我改变主题时使用的代码…

 SharedPreferences pref = PreferenceManager .getDefaultSharedPreferences(this); String themeName = pref.getString("prefSyncFrequency3", "Theme1"); if (themeName.equals("Africa")) { setTheme(R.style.AppTheme); } else if (themeName.equals("Colorful Beach")) { //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show(); setTheme(R.style.beach); } else if (themeName.equals("Abstract")) { //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show(); setTheme(R.style.abstract2); } else if (themeName.equals("Default")) { setTheme(R.style.defaulttheme); }