3

I have two activities. One is main activity and another is settings activity.

I want to change theme from settings activity when user selects color from color picker dialog.

For now I am able to change the theme , but its only changing theme for settings activity not of main activity. How can I set theme to main activity?

Settings Activity:

public class Settings extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {


          Theme.onActivityCreateSetTheme(this);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);



    final ColorPickerDialog colorPickerDialog = new ColorPickerDialog();
    colorPickerDialog.initialize(R.string.dialog_title, new int[]{Color.CYAN, Color.LTGRAY, Color.BLACK, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.GRAY, Color.YELLOW}, Color.YELLOW, 3, 2);
    colorPickerDialog.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener() {

        @Override
        public void onColorSelected(int color) {



            //  startActivityForResult(new Intent(getApplicationContext(),
            //         ThemedPreferenceActivity.class), SETTINGS_ACTION);

            if (color == Color.CYAN) {
                Theme.changeToTheme(Settings.this, Theme.THEME_DEFAULT);
                no = 0;
            }
            else if (color == Color.LTGRAY)

            {
                Theme.changeToTheme(Settings.this, Theme.THEME_WHITE);
                no = 1;
            }
            else if (color == Color.BLACK) {

                Theme.changeToTheme(Settings.this,Theme.THEME_BLUE);
                no = 3;

            }
            Toast.makeText(Settings.this, "selectedColor : " + color, Toast.LENGTH_SHORT).show();
        }

    });



    SharedPreferences.Editor editor = sharedpreferences.edit();

    editor.putInt("color_1",no);
    editor.putInt("color_2",no);
    editor.putInt("color_3",no);
    editor.commit();

    LinearLayout theme = (LinearLayout)findViewById(R.id.theme);

    theme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            colorPickerDialog.show(getSupportFragmentManager(), "colorpicker");
        }
    });


}

Theme :

 public class Theme {

    private static int sTheme;

    public final static int THEME_DEFAULT = 0;
    public final static int THEME_WHITE = 1;
    public final static int THEME_BLUE = 2;

    /** * Set the theme of the Activity, and restart it by creating a new Activity of the same type. */
    public static void changeToTheme(Activity activity, int theme) {
        sTheme = theme; activity.finish();

  activity.startActivity(new Intent(activity, activity.getClass()));
    }

    /** Set the theme of the activity, according to the configuration. */
    public static void onActivityCreateSetTheme(Activity activity) {
        switch (sTheme) {
            default: case THEME_DEFAULT:
                activity.setTheme(R.style.BlueTheme);
                break;
        }
    }
}

Edit :

Main Activity :

  @Override
protected void onCreate(Bundle savedInstanceState) {

    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();


    no = pref.getInt("color_1", 0);        
    no = pref.getInt("color_2", 0);
    no = pref.getInt("color_3", 0);

    if(no == 0)
    {
        setTheme(R.style.AppTheme);
    }

    else if(no == 1)
    {
        setTheme(R.style.AppTheme_Solarized);
    }

    else if(no == 2)
    {
        setTheme(R.style.BlueTheme);
    }


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

Thank you..

user5881997
  • 219
  • 2
  • 19
  • see the question it may be helpful. [How to change current Theme at runtime in Android](http://stackoverflow.com/questions/2482848/how-to-change-current-theme-at-runtime-in-android) –  Feb 15 '16 at 12:06

2 Answers2

0
     public void updateTheme(int themeID) {
        setTheme(themeID);
         Intent intent = getIntent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();
        overridePendingTransition(0, 0);
        startActivity(intent);
        overridePendingTransition(0, 0);
    }
Ahmad Aghazadeh
  • 16,571
  • 12
  • 101
  • 98
0

You can't change theme dynamically until unless you restart the current activity.

You can achieve this using two approaches for your questions:

  1. Store onCreate of activity before setting content view check the shared the data from preference and set theme accordingly. From Setting activity set shared data. In MainActivity check shared data.

    public void onCreate(Bundle savedInstanceState)
    {
        if (checkColorData("navcolor").equals("SomeColor"))
        {
            setTheme(R.style.AppTheme);
        }
        else
        {
            setTheme(R.style.AppThemeDarkNav);
        }
    }
    
  2. Use toolbar for action bar and use some color changeable views you can change color by calling setBackgoundColor

Flygenring
  • 3,818
  • 1
  • 32
  • 39
Bharath Kumar
  • 534
  • 1
  • 7
  • 18
  • I tried this still there is no change on main activity. Please can you check edited question and tell me what's wrong?@Flygenring , @Bharath Kumar – user5881997 Feb 15 '16 at 14:30