Android:如何以编程方式设置活动';s主题到主题。对话框
因此,我有一个Android:如何以编程方式设置活动';s主题到主题。对话框,android,android-activity,dialog,themes,Android,Android Activity,Dialog,Themes,因此,我有一个活动(比如测试活动),它需要作为一个正常的非主题活动,以及一个主题。对话框。我试图为这两个任务重用相同的TestActivity 我所要做的就是动态地设置主题。 代码很简单: 这是我的活动的onCreate,它在黑色背景下工作 public void onCreate(Bundle icicle) { if (Utility.isDialog == true) setTheme(android.R.style.Theme_Dialog); super
活动
(比如测试活动
),它需要作为一个正常的非主题活动
,以及一个主题。对话框
。我试图为这两个任务重用相同的TestActivity
我所要做的就是动态地设置主题。
代码很简单:
这是我的活动的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"/>
。但有一种强烈的感觉,这是可以做到的
欢迎提出所有建议。在调用setContentView()
之前,请先调用onCreate()
。希望给出解决此问题的方法
问题:如何使用与基于对话框和全屏的活动相同的活动
解决方案:
使用主题@android:style/theme.Dialog
在各自的.Java
文件中,检查定义对话框
模式的意图
额外信息
如果不存在,请将主题设置为android.R.style.Theme
。这是默认的主题
,如果未定义任何主题,将应用该主题
代码:
boolean fDialogMode = getIntent().hasExtra("dialog_mode");
if( ! fDialogMode ) {
super.setTheme(android.R.style.Theme);
}
替代解决方案:
更复杂的解决方案是使用AlertDialog
,如下所示:
定义从ArrayAdapter
扩展的ListAdapter
类李>
在getCount
函数中返回1
@Override
public int getCount() { return 1; }
在getView
功能中,对活动的布局进行充气
,并在返回视图之前进行任何自定义
@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;
}
@覆盖
公共视图getView(内部位置、视图视图、视图组){
视图v=视图;
如果(v==null){
v=getSystemService(Context.LAYOUT\u INFLATER\u SERVICE).inflate(,null);
}
…在这里进行任何自定义。。。。
返回v;
}
如果您在活动
类
中没有做太多处理,这肯定是第二个选择,这可能是一个选项
仅考虑这种解决方案的原因可能是在<>代码>对话框/代码>中显示的逻辑被隔离到用作对话的地方。
这两个选项对我都有效,但出于显而易见的原因,我选择了第一个选项。:-) 您可以在调用setContentView(…)
和super.oncreate()
之前使用setTheme(…)
,它应该可以正常工作在调用super.oncreate(savedInstance)
之前使用setTheme
像其他几种方法一样,在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);
}
我在讨论中发现上述内容:这可能不适用于您的情况,但您可以使用以下主题:
Theme.Holo.DialogWhenLarge
当屏幕较大时,它会将您的活动显示为对话框,当屏幕较小时,它会将您的活动显示为常规活动。
这在上的Android文档中有介绍,还包含有关编程对话框的信息,该对话框也可以作为全屏片段使用sun。我知道我迟到了,但我想在这里发布一个解决方案:
检查完整的源代码。这是我在更改主题时使用的代码
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);
}
默认主题库调用:
super.setTheme(android.R.style.Theme);
在我的例子中,我使用的是AppCompat主题,因此请确保您在id上引用了正确的库(即):
鲁本,虽然它可以工作(我之前也试过),但我看到的是黑色背景,而不是调用Activity,所以您的主题属性不正确。你的android:windowBackground设置为什么?鲁本:我还没有定义自定义样式。但我现在将使用windowBackground实现自定义样式,以颜色/透明度为uben,即使自定义样式不起作用。要了解有关WindowBack的答案并查看此帖子,请查看更新后的帖子及其代码。有关详细信息,请告诉我。我是否接受正如上面所说的,这个问题没有解决方案?您没有调用setContentView,我知道这是可以做到的,因为我在活动中调用了setTheme,然后super.onCreate使它对我起作用,谢谢!仅供参考:这确实有效,但由于某种原因(在Kindle Fire上)它在创建新活动时造成了巨大的延迟,并使我的应用程序在Nook颜色上意外崩溃。我以前从未在Kindle上尝试过它,对于信息,thx必须在我得到一个时进行测试。此解决方案不适用于所有设备。考虑一下摩托罗拉XOOM,结果是一个对话框在黑色背景之上,而不是一个透明的对话框。很好的解释,谢谢!如果有人在第一时间没有得到它(比如我:D)-请先阅读@mozarty solution以了解您应该将此代码放在何处。但是,由于Android在onCreate()调用之前调用了setTheme(),因此无法使用通常发送给活动的数据来决定是否更改主题。做出这个决定还需要一些额外的技巧。请花一些时间来解释这是如何解决问题的,以便其他有类似问题的人能够清楚地知道这个问题。
super.setTheme(android.R.style.Theme);
super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);