Android setTheme函数在resume上不起作用
我正在尝试使用setTheme函数,它基本上是基于一些DB值来设置主题,但问题是,一旦我用要设置的主题更新了DB,我需要完成()要实现的主题设置的活动。守则是—Android setTheme函数在resume上不起作用,android,android-theme,Android,Android Theme,我正在尝试使用setTheme函数,它基本上是基于一些DB值来设置主题,但问题是,一旦我用要设置的主题更新了DB,我需要完成()要实现的主题设置的活动。守则是— @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settingsDBAdapter = new SettingsDBAdapter(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
settingsDBAdapter = new SettingsDBAdapter(this);
settingsDBAdapter.open();
setSettingsTheme(); <<------THIS LINE WILL SET THEME
setContentView(R.layout.layout_task_manager);
quickAddButton = (Button) findViewById(R.id.QuickAddButtonId);
quickAddTaskText = (EditText) findViewById(R.id.QuickAddEditTextId);
mDBHelper = new TasksDBAdapter(this);
mDBHelper.open();
fillData();
//code to create long press on any list item and calls onCreateContextMenu method
registerForContextMenu(getListView());
registerButtonListenersAndSetDefaultText();
}
public void setSettingsTheme(){
String currentTheme = settingsDBAdapter.fetchThemeSettings("theme");
Log.i(TAG,"settingsDBAdapter + currentTheme-->" + settingsDBAdapter + currentTheme);
//setTheme(R.style.HoloTheme);
if(currentTheme.trim().equalsIgnoreCase("holo")){
Log.i(TAG, "in holo<<<<<<<<");
setTheme(R.style.HoloTheme);
}else if(currentTheme.trim().equalsIgnoreCase("hololight")){
Log.i(TAG, "in hololight<<<<<<<");
setTheme(R.style.HoloLightTheme);
}else{
Log.i(TAG, "iin else<<<<<<<");
setTheme(R.style.HoloTheme);
}
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
settingsDBAdapter=新的settingsDBAdapter(本);
setingsdbadapter.open();
setSettingsTheme();的文档说明:
设置此上下文的基本主题。请注意,应调用
在上下文中实例化任何视图之前(例如在
调用setContentView(视图)
或充气(int,ViewGroup)
)
主题
属性在视图
的构造函数中读取,因此在更改主题后,您将需要重新创建UI。您可以调用finish()
,然后调用startActivity(getIntent())
在您的活动中重新启动它,或者必须编写一种方法来重建每个视图对象。首先,请向Raffaele致敬,感谢他为我指明了正确的方向
另外,我知道这是一个老帖子,所以如果现在有更好的方法,请让我知道
无论如何
我在尝试为我的Moto360创建手表面板时遇到类似问题。您不能更改视图层次结构引用的主题实例,但可以强制该实例采用要切换到的主题的属性。如果您获得对主题的引用并调用Resource.theme.applyStyle(int,boolean)
,目标主题的属性将应用于视图引用的主题。之后,调用使视图无效将使用新样式更新UI
例如:(活动中的某个地方…)
同样,我在Moto360上的一个手表表面服务上做了这件事,没有发生任何事故。我还没有在活动中尝试过这件事
您可以看到我的代码。我通过调用finish()尝试了同样的方法如果用户单击“活动”上的“上一步”按钮。但这是实现的唯一方法吗?是的,是的。视图
构造函数是查询主题
对象的唯一位置。无法通知视图
对象主题已重置。唯一的机会是使用自定义视图:在这种情况下,您可以提供可选回调以允许热交换主题。但是Android不提供这样的框架,setTheme()也应该在super.onCreate(savedInstanceState)之前;在Android 2.3上,我遇到了这个问题。每次调用setTheme()之后,您是否调用setContentView()?我只是调用finish()用户退出应用程序后,以及用户重新启动应用程序时,会调用应用程序setCOntentView()。是否仍要将其取消设置,以便用户无需重新启动应用程序。?因此,我在为我的Moto360创建手表面时遇到了类似的问题。无论是好是坏,我使用了以下选项:,布尔值)
Resources.Theme myTheme = SomeActivity.this.getTheme();
View myThemedView = SomeActivity.this.findViewById(R.id.myRootView);
myTheme.applyStyle(R.style.MyOtherTheme,true);
myThemedView.invalidate();
// Above, "true" clobbers existing styles, "false" preserves them
// and attempts to add in any new attributes.