How to set a theme to whole application in code, but not in the Manifest?

前端 未结 6 1500
萌比男神i
萌比男神i 2020-12-16 17:11

I know how to set theme to whole application in manifest,but how to set theme to whole application programmatically ? I am trying this: getApplicationContext.se

6条回答
  •  时光说笑
    2020-12-16 18:00

    I spent a lot of time getting this to work and now my app has selectable Light and Dark themes which can even be selected dynamically coming immediately into play including Prefs. Below is the resource I use with some other ideas commented out which I played with at some starge.

    
    
        
        
        
        
        
        
    
    
    
        
        
            
            
        
    
        
            
        
    
     
    

    The key item here is

    true
    

    and that took me a while to realize. My app does some heavy lifting while starting so it was important to not have the mandatory Manifest theme showing before the one I set in onCreate.

    To be able to restart the app dynamically I check if this was how the app was started/restarted like this.

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    boolean useThemeLight = sp.getBoolean("useThemeLight", false);
    //Since this Activity can also be started by the Theme Toggle in the Action bar we need to see if
    //there is a TOGGLE_THEME extra which only it uses
    Intent curIntent = this.getIntent();
    if (curIntent.getExtras() != null && curIntent.getExtras().containsKey(TOGGLE_THEME)) {
        if(curIntent.getStringExtra(TOGGLE_THEME).equals("Dark")){
            this.setTheme(R.style.MyAppThemeDark);
            CurrentTheme = "Dark";
        }else{
            this.setTheme(R.style.MyAppThemeLight);
            CurrentTheme = "Light";
        }
        activityThemeToggleActive = true;
    } else {
        if (useThemeLight) {
            this.setTheme(R.style.MyAppThemeLight);
            CurrentTheme = "Light";
        } else {
            this.setTheme(R.style.MyAppThemeDark);
            CurrentTheme = "Dark";
        }
    }
    

    In Preferences I do this.

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    boolean useThemeLight = sp.getBoolean("useThemeLight", false);
    if (useThemeLight) {
        this.setTheme(R.style.MyAppThemeLight);
    } else {
        this.setTheme(R.style.MyAppThemeDark);
    }
    

    Hope this gets you started. Regards, John.

提交回复
热议问题