Search code examples
androidandroid-actionbarcolor-picker

Changing ActionBar background color programatically from a preference


I've added a color picker preference to the settings in my app so the user can pick the background color of the ActionBar (I'm using ActionBarSherlock). Ideally I'd like to change the color without having the user restart the app which, I'm assuming, means adding the code to change the color in onResume in every Activity and Fragment. However, the color change works when I first hit an activity, but if I go back to it, either using the back button on my device or in the ActionBar itself, the color seems to not be set and is transparent.

This is the code I'm using to set the background color. I tried adding it to onCreate as well as onResume:

public class MyActivity extends SherlockActivity {

   @Override
    public void onCreate(final Bundle icicle) 
    {
        super.onCreate(icicle);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);        
        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(PreferenceManager.getDefaultSharedPreferences(this).getInt("app_color", getResources().getColor(R.color.app_color))));
    }

    @Override
    public void onResume()
    { 
        super.onResume();

        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(PreferenceManager.getDefaultSharedPreferences(this).getInt("app_color", getResources().getColor(R.color.app_color))));
    }
}

app_color is the name of the color picker preference and also have a default color, stored in the colors value file. I also have a TextView footer that doesn't have the same issue and retains the color.


Solution

  • I had the same problem and what i came up with is probably not the best solution but at least works for me for the time being. I check in onRestart with the following method if the theme has changed (in your app you would check if the background color has changed) and if so I start the activity as in the following code snippet. In my app I put this method in the application class as i use it in every activity.

    public static void restartOnThemeSwitch(Activity act) {
    
        String currentTheme = getThemeName(act.getTheme());
    
        String prefTheme = (prefs.getString(THEME, "dark"));
    
        if (currentTheme.equalsIgnoreCase(prefTheme) == false) {
    
    
            Intent it = act.getIntent();
            it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            act.startActivity(it);
    
        }
    
    }