How to change current Theme at runtime in Android [duplicate] How to change current Theme at runtime in Android [duplicate] android android

How to change current Theme at runtime in Android [duplicate]


I would like to see the method too, where you set once for all your activities. But as far I know you have to set in each activity before showing any views.

For reference check this:

http://www.anddev.org/applying_a_theme_to_your_application-t817.html

Edit (copied from that forum):

    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // Call setTheme before creation of any(!) View.         setTheme(android.R.style.Theme_Dark);        // ...        setContentView(R.layout.main);    }


Edit
If you call setTheme after super.onCreate(savedInstanceState); your activity recreated but if you call setTheme before super.onCreate(savedInstanceState); your theme will set and activity does not recreate anymore

  protected void onCreate(Bundle savedInstanceState) {     setTheme(android.R.style.Theme_Dark);     super.onCreate(savedInstanceState);    // ...    setContentView(R.layout.main);}


If you want to change theme of an already existing activity, call recreate() after setTheme().

Note: don't call recreate if you change theme in onCreate(), to avoid infinite loop.


recreate() (as mentioned by TPReal) will only restart current activity, but the previous activities will still be in back stack and theme will not be applied to them.

So, another solution for this problem is to recreate the task stack completely, like this:

    TaskStackBuilder.create(getActivity())            .addNextIntent(new Intent(getActivity(), MainActivity.class))            .addNextIntent(getActivity().getIntent())            .startActivities();

EDIT:

Just put the code above after you perform changing of theme on the UI or somewhere else. All your activities should have method setTheme() called before onCreate(), probably in some parent activity. It is also a normal approach to store the theme chosen in SharedPreferences, read it and then set using setTheme() method.