如何根据打开的拨动开关更改多个主题

How To Make Multiple Themes Change Based On Which Toggle Switch Is Turned On

我正在尝试为我的应用程序创建一个主题首选项页面。我已经能够让一个拨动开关工作。当我打开和关闭它时,主题会改变。我希望有多个不同的主题可以在选择其他切换开关之一时切换。我已经对如何完成此操作的任何示例进行了相当广泛的搜索,但似乎找不到任何东西。

我将不胜感激有关此主题的任何指导。下面是所选主题颜色 Banana 的屏幕截图,当我应用 onyx 时,banana 的开关没有关闭,为了恢复到我的默认设置,我必须同时关闭 onyx 和 banana。

这是我应用主题的 SettingsActivity

public class SettingsActivity extends AppCompatActivity {

private static final String PREFS_NAME = "prefs";
private static final String PREF_BANANA_THEME = "banana_theme";
private static final String PREF_ONYX_THEME = "onyx_theme";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Use the chosen theme
    SharedPreferences preferences = getSharedPreferences( PREFS_NAME, MODE_PRIVATE );
    boolean useBananaTheme = preferences.getBoolean( PREF_BANANA_THEME, false );
    if (useBananaTheme) {
        setTheme( R.style.AppTheme_Banana_NoActionBar );
    }
    boolean useOnyxTheme = preferences.getBoolean( PREF_ONYX_THEME, false );
    if (useOnyxTheme) {
        setTheme( R.style.AppTheme_Onyx_NoActionBar );
    }
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_settings );
    Toolbar toolbar = (Toolbar) findViewById( R.id.toolbar );
    setSupportActionBar( toolbar );
    Objects.requireNonNull( getSupportActionBar() ).setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(getApplicationContext(),MainActivity.class));
            finish();
        }
    });
    Switch toggle1 = (Switch) findViewById( R.id.switch1 );
    toggle1.setChecked( useBananaTheme );
    toggle1.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton view, boolean isChecked) {
            toggleThemeBanana( isChecked );
        }
    } );
    Switch toggle2 = (Switch) findViewById( R.id.switch2 );
    toggle2.setChecked( useOnyxTheme );
    toggle2.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton view, boolean isChecked) {
            toggleThemeOnyx( isChecked );
        }
    } );
}
private void toggleThemeBanana(boolean bananaTheme) {
    SharedPreferences.Editor editor = getSharedPreferences( PREFS_NAME, MODE_PRIVATE ).edit();
    editor.putBoolean( PREF_BANANA_THEME, bananaTheme );
    editor.apply();
    Intent intent = getIntent();
    finish();
    startActivity( intent );
}
private void toggleThemeOnyx(boolean onyxTheme) {
        SharedPreferences.Editor editor = getSharedPreferences( PREFS_NAME, MODE_PRIVATE ).edit();
        editor.putBoolean( PREF_ONYX_THEME, onyxTheme );
        editor.apply();
        Intent intent = getIntent();
        finish();
        startActivity( intent );
    }
}

我已经想通了这个问题。我需要将所有切换开关设置为 false。下面是一段代码,展示了这方面的一个例子。

final Switch blue = (Switch) findViewById( R.id.blue );
        blue.setChecked( useBlueTheme );
        blue.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton view, boolean isChecked) {
                toggleThemeBlue(isChecked);
                //toggleThemeBlue(false);
                toggleThemeGreen(false);
                toggleThemeOrange(false);
                toggleThemeRed(false);
                toggleThemeYellow(false);
            }
        } );
        final Switch green = (Switch) findViewById( R.id.green );
        green.setChecked( useGreenTheme );
        green.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton view, boolean isChecked) {
                toggleThemeGreen(isChecked);
                toggleThemeBlue(false);
                //toggleThemeGreen(false);
                toggleThemeOrange(false);
                toggleThemeRed(false);
                toggleThemeYellow(false);
            }

        } );

我希望这对可能正在寻找类似内容的其他人有所帮助。