Android:How to programmatically set an Activity's theme to Theme.Dialog
所以我有一个
我正在寻找动态设置主题。
代码很简单:
这是我的活动的
1 2 3 4 5 6 | public void onCreate(Bundle icicle) { if (Utility.isDialog == true) setTheme(android.R.style.Theme_Dialog); super.onCreate(icicle); requestWindowFeature(Window.FEATURE_NO_TITLE); ..... |
这是Manifest Entry
1 |
在此期间,我发现一篇帖子说这里无法完成的帖子是http://code.google.com/p/android/issues/detail?id=4394。但是有一种强烈的感觉 可以做到。
欢迎所有建议。
想解决这个问题。
问题:如何使用基于对话框和全屏的相同活动。
方案:
代码:
1 2 3 4 5 | boolean fDialogMode = getIntent().hasExtra("dialog_mode"); if( ! fDialogMode ) { super.setTheme(android.R.style.Theme); } |
替代解决方案:
更复杂的解决方案是使用
在
1 2 | @Override public int getCount() { return 1; } |
在
1 2 3 4 5 6 7 8 9 10 11 | @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; } |
如果您没有在
只考虑这个解决方案的原因可能是在
这两个选项对我有用,但由于显而易见的原因,我选择了第一个选项。 :-)
您可以在调用
和其他几个一样,在onCreate中调用setTheme(在调用super.onCreate之前或之后)都不起作用。但是,通过重写setTheme,我能够指定除Manifest.xml中所述之外的主题。具体来说,以下工作没有问题:
1 2 3 4 5 | @Override public void setTheme(int resid) { boolean changeTheme = true; super.setTheme(changeTheme ? android.R.style.Theme_Dialog : resid); } |
我在讨论中找到了以上内容:https://code.google.com/p/android/issues/detail?id = 4394
在调用
在调用
默认主题库调用:
1 | super.setTheme(android.R.style.Theme); |
在我的情况下,我使用的是AppCompat主题,因此请确保在您的id上引用正确的库(即):
1 | super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar); |
这可能不适用于您的情况,但您可以使用主题:
1 | Theme.Holo.DialogWhenLarge |
它会在屏幕较大时将您的活动显示为对话框,并在屏幕较小时显示为常规活动。
这在Dialogs的Android文档中有所介绍,还包含有关编写Dialog的信息,该对话框也可以作为全屏片段进行晒黑。
我知道我迟到但我想在这里发布一个解决方案:
在这里查看完整的源代码。这是我在更改主题时使用的代码...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } |
1 | setTheme(android.R.style.Theme_Dialog); |