如何使我的主题以编程方式延续到其他活动中?

时间:2019-01-14 16:48:51

标签: java android sharedpreferences android-night-mode

我已经在我的应用程序的设置页面中创建了一个函数,其中包含一个开关-按下该开关时-切换到第二个“夜”主题。我大部分时间都关注this tutorial。但是,我不知道如何将这种夜间模式带入我的其他活动中?我曾尝试在我的主要活动中调用“如果已检查开关”,但显然看不到该开关。我主要需要知道的是,如何检查另一个活动中的开关状态?这甚至是正确的做法吗?让我知道我是否在这个问题上还有其他想念的地方。

// ========设置页面的代码========= //

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);


    // ======== Night Mode ======== //
    SwitchCompat switchCompat;
    final SharedPref sharedPref;

    sharedPref = new SharedPref(this);

    if (sharedPref.loadNightModeState()) {
        setTheme(R.style.AppTheme_Night);
        getSupportActionBar().setBackgroundDrawable(getDrawable(R.drawable.actionbar));
        actionBarDrawerToggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.BackgroundLight));
    } else setTheme(R.style.AppTheme);

    setContentView(R.layout.activity_settings);
    switchCompat = (SwitchCompat) findViewById(R.id.night_switch);
    if (sharedPref.loadNightModeState()) {
        switchCompat.setChecked(true);
    }

    switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
               sharedPref.setNightModeState(true);
                restartApp();
            } else {
                sharedPref.setNightModeState(false);
                restartApp();
            }
        }
    });
}




private void restartApp() {
    Intent intent = new Intent(getApplicationContext(), SettingsActivity.class);
    startActivity(intent);
    finish();
}

// ======== SharedPref代码======== //

public class SharedPref {

private SharedPreferences sharedPreferences;


public SharedPref(Context context) {
    sharedPreferences = context.getSharedPreferences("filename", Context.MODE_PRIVATE);
}


public void setNightModeState(Boolean state) {
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean("NightMode",state);
    editor.apply();
}

public Boolean loadNightModeState (){
    Boolean state = sharedPreferences.getBoolean("NightMode", false);
    return state;
}

2 个答案:

答案 0 :(得分:1)

在您的onCreate内的应用程序类中

SharedPreferences sharedPreferences = getSharedPreferences("Your_Shared_pref", Context.MODE_PRIVATE);
boolean nightMode = sharedPreferences.getBoolean(SettingsActivity.DARK_THEME_PREFERENCE_KEY, false);

AppCompatDelegate.setDefaultNightMode(nightMode ? MODE_NIGHT_YES : MODE_NIGHT_NO);

比您的活动要多:

 switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        AppCompatDelegate.setDefaultNightMode(isChecked ? MODE_NIGHT_YES : MODE_NIGHT_NO);
        if (isChecked) {
           sharedPref.setNightModeState(true);
            recreate();
        } else {
            sharedPref.setNightModeState(false);
            recreate();
        }
    }
});

@Override
public void recreate() {
    finish();
    overridePendingTransition(R.anim.anime_fade_in,
            R.anim.anime_fade_out);
    startActivity(getIntent());
    overridePendingTransition(R.anim.anime_fade_in,
            R.anim.anime_fade_out);
}

您可以在线找到动画xml。

答案 1 :(得分:0)

我把它放在我的onCreate和我的super.onCreate之间。我使用的代码来自我的设置Java页面。事实证明,这很容易理解,我只需要一个人就可以看到它!

 @Override
    protected void onCreate(Bundle savedInstanceState) {


        final SharedPref sharedPref;
        sharedPref = new SharedPref(this);

        if (sharedPref.loadNightModeState()) {
            setTheme(R.style.AppTheme_Night);
            //restartApp();
            //getSupportActionBar().setBackgroundDrawable(getDrawable(R.drawable.actionbar));
            //actionBarDrawerToggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.BackgroundLight));
        } else setTheme(R.style.AppTheme);
        //restartApp();


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