Как изменить несколько тем в зависимости от того, какой тумблер включен

Я пытаюсь создать страницу настроек темы для моего приложения. Я был в состоянии заставить один тумблер работать. Тема меняется при включении и выключении. Я хотел бы иметь несколько разных тем, которые можно переключать при выборе одного из других тумблеров. Я провел довольно обширный поиск любых примеров того, как это будет сделано, но, похоже, ничего не могу найти.

Буду признателен за любые указания по этому вопросу. Ниже приведен снимок экрана с выбранным цветом темы "Банан", когда я применяю к ним оникс, переключатель банана не отключается, и чтобы вернуться к настройкам по умолчанию, я должен отключить и оникс, и банан.

Вот мои настройки деятельности, где я применяю тему

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

введите описание изображения здесь введите описание изображения здесь

1 ответ

Решение

Я понял эту проблему. Мне нужно было установить все переключатели в положение 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);
            }

        } );

Я надеюсь, что это поможет кому-то еще, кто может искать что-то подобное.

Другие вопросы по тегам