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议都欢迎。
想解决这个问题。
问题:如何使用基于对话框和全屏的相同的活动。
解答:
- 使用主题
@android:style/Theme.Dialog
在AndroidManifest.xml中定义您的活动 - 在各自的
.Java
文件中,检查定义dialog
模式的intent
附加。 - 如果它不存在,请将
Theme
设置为android.R.style.Theme
。 如果你没有定义任何主题,这是应用的默认主题。
代码:
boolean fDialogMode = getIntent().hasExtra("dialog_mode"); if( ! fDialogMode ) { super.setTheme(android.R.style.Theme); }
备用解决scheme:
更复杂的解决scheme是使用AlertDialog
,如下所示:
- 定义从
ArrayAdapter
扩展的ListAdapter
类。 -
在
getCount
函数中返回1
@Override public int getCount() { return 1; }
-
在
getView
函数中,inflate
你需要的activity
的layout
,并在返回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); }