简体   繁体   中英

How to set theme to Main Activity from another activity?

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..

     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);
    }

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM