解决是否为活动更改主题

时间:2010-12-02 12:08:20

标签: android themes

我正在编写一个应该支持gui主题的应用程序。应用和配置它没有问题,但理解的问题是特定活动的主题已更改。

有几个活动使用主题。还有另一个扩展PreferenceActivity并提供选择主题的功能。选择的主题的ID将保存为共享首选项。当一些使用主题的活动被onResume()调用时,我想检查当前主题ID是否等于共享首选项中保存的主题ID。但是Theme对象没有任何id或方法来识别它。

更新:现在我正在考虑在每个活动中都有一个当前主题的字符串名称,但是这个解决方案看起来相当丑陋,因为我必须在应用程序中为每个活动添加相同的变量。

进行此检查的正确方法是什么?我做错了吗?

2 个答案:

答案 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;
    }

}