我正在编写一个应该支持gui主题的应用程序。应用和配置它没有问题,但理解的问题是特定活动的主题已更改。
有几个活动使用主题。还有另一个扩展PreferenceActivity
并提供选择主题的功能。选择的主题的ID将保存为共享首选项。当一些使用主题的活动被onResume()
调用时,我想检查当前主题ID是否等于共享首选项中保存的主题ID。但是Theme
对象没有任何id或方法来识别它。
更新:现在我正在考虑在每个活动中都有一个当前主题的字符串名称,但是这个解决方案看起来相当丑陋,因为我必须在应用程序中为每个活动添加相同的变量。
进行此检查的正确方法是什么?我做错了吗?
答案 0 :(得分:0)
我见过要求您重启应用以使主题更改生效的应用。我不认为这是一个问题。这样你就可以在启动时应用主题而不用担心它。
答案 1 :(得分:0)
这可能就是你想要的。我正在使用一个标志,以便在设置活动中设置主题并返回此调用活动后,将重新启动调用活动并将主题设置为SharedPreferences
中的某个值。
private boolean activityStarted = false;
public void onCreate(Bundle savedInstanceState) {
Log.d(DEBUG_TAG, "onCreate()");
activityStarted = true;
setTheme(); // user-defined method
super.onCreate(savedInstanceState);
...
}
@Override
protected void onResume() {
super.onResume();
Log.d(DEBUG_TAG, "onResume()");
if(activityStarted == true){ // it has come from onCreate()
activityStarted = false; // Set flag to false so that next time onResume()
// is called after resuming existing activity,
// the activity will be restarted and theme will
// be set
} else { // it has directly come to onResume()
finish();
startActivity(getIntent());
}
}
我不确定这是否是更好的方法,但是我没有将逻辑放入onResume()
方法,而是覆盖onActivityResult()
方法并重新启动Activity
if之前的Activity
是设置Activity
。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.settings) {
Intent settings_intent = new Intent(this, Settings.class);
startActivityForResult(settings_intent, SETTINGS);
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
// Identify our request code
switch (reqCode) {
case SETTINGS:
if (resultCode == RESULT_CANCELED) {
Log.d(DEBUG_TAG, "RESULT_CANCELED");
finish();
startActivity(getIntent());
} else if (resultCode == RESULT_OK) {
Log.d(DEBUG_TAG, "RESULT_OK");
}
break;
}
}