Использование setTheme () во время выполнения изменяет только цвет текста - PullRequest
0 голосов
/ 17 октября 2018

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

Моя темная тема в styles.xml:

<style name="Dark" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/dark_background</item>
    <item name="colorPrimaryDark">@color/dark_top</item>
    <item name="colorAccent">@color/dark_button</item>
    <item name="colorButtonNormal">@color/dark_button</item>
    <item name="android:colorBackground">@color/dark_background</item>
    <item name="android:itemBackground">@color/dark_background</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">#EAEAEA</item>
    <item name="android:textColorPrimary">@color/white</item>
    <item name="android:textColorSecondary">@color/white</item>
    <item name="android:textColorTertiary">@color/white</item>
</style>

Мой способ установкистиль:

setTheme(R.style.Dark);

До смены темы: до

После смены темы: после

Не оченьзнаю, почему.Это из-за NavigationView?

1 Ответ

0 голосов
/ 17 октября 2018

Убедитесь, что вы звоните setTheme() до setContentView() или надуваете представление.В соответствии с документацией вы должны использовать setTheme(), прежде чем создавать какие-либо представления в контексте.Используйте recreate(), чтобы создать новый экземпляр вашей деятельности, чтобы вы могли применить измененную тему в методе onCreate().

Вы можете найти несколько примеров переключения тем, если немного поискать.Это ссылка на один из таких примеров: https://gist.github.com/alphamu/f2469c28e17b24114fe5

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

Пример класса MyAppPreferences:

public class MyAppPreferences {

    private static SharedPreferences getPrefs(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static int getThemeId(Context context, int defaultThemeId) {
        return getPrefs(context).getInt("CurrentThemeId", defaultThemeId);
    }
    public static void setThemeId(Context context, int value) {
        getPrefs(context).edit().putInt("CurrentThemeId", value).commit();
    }

}

Пример класса Activity с использованием класса MyAppPreferences:

public class MyActivity extends AppCompatActivity implements OnClickListener {

    private Button btnDark;
    private Button btnLight;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);            
        // Set the theme
        // If there is nothing set, the light theme will be used by default
        setTheme(MyAppPreferences.getThemeId(this, R.style.Light));
        setContentView(R.layout.myLayout);

        btnDark = (Button) this.findViewById(R.id.viewbtnDark);
        btnDark.setOnClickListener(this);

        btnLight = (Button) this.findViewById(R.id.viewbtnLight);
        btnLight.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // 1. Set the theme preference
        // 2. Recreate the activity to "apply" the theme
        if (v.equals(btnDark)) {
            MyAppPreferences.setThemeId(this, R.style.Dark);
            this.recreate();
        } else if (v.equals(btnLight)) {
            MyAppPreferences.setThemeId(this, R.style.Light);
            this.recreate();
        }
    }

}

В вашем примере темы не отображаются параметры windowActionBar или windowNoTitle, поэтому, если вы используете тему по умолчанию и не устанавливаете эти параметрытак же, как в вашей темной теме, вы все равно можете столкнуться с падениями.Проверьте Logcat на наличие ошибки, подобной этой: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor..

Пример темной темы

<style name="Dark" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/dark_background</item>
    <item name="colorPrimaryDark">@color/dark_top</item>
    <item name="colorAccent">@color/dark_button</item>
    <item name="colorButtonNormal">@color/dark_button</item>
    <item name="android:colorBackground">@color/dark_background</item>
    <item name="android:itemBackground">@color/dark_background</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">#EAEAEA</item>
    <item name="android:textColorPrimary">@color/white</item>
    <item name="android:textColorSecondary">@color/white</item>
    <item name="android:textColorTertiary">@color/white</item>
</style>
...