Изменение темы действия из фрагмента - PullRequest
0 голосов
/ 23 февраля 2020

Сначала я введу свой код. Взгляните на темы:

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:windowEnableSplitTouch">false</item>
    </style>


    <style name="AppTheme.Launcher">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:windowBackground">@drawable/launch_screen</item>
    </style>
</resources>

AppTheme.Launcher используется для того, чтобы пользователь приветствовал "spla sh screen". В функции MainActivity onCreate я меняю тему, используя setTheme(R.style.AppTheme), а также скрываю панель действий, используя supportActionBar?.hide(). Мое приложение ориентировано на фрагменты. У меня есть только одна активность, которая содержит схему навигации, которая имеет несколько фрагментов. Проблема в следующем:

    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>

В одном из моих фрагментов я хочу снова показать панель действий и не хочу, чтобы моя строка состояния была полупрозрачной, или, другими словами, я хочу, чтобы она быть видимым и иметь цвет PrimaryDark. Для этого я написал функцию внутри MainActivity .

    fun clearTranslucent() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val w: Window = window
            w.clearFlags(
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
            )
            w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
        }
    }

Weird status bar behavior

Здесь начинается самое интересное. По какой-то причине этот пробел добавляется между ними. Если я решу закомментировать эту строку WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, результаты будут еще более странными. Строка состояния становится серым , и мой ScrollView перестает работать. Эта же ошибка следует за мной в нескольких фрагментах, когда я хочу изменить оригинальную тему упражнения. Я пытался изменить тему из фрагмента, но это не работает. Где-то читал, что тему «Активность» можно изменить только из функции onCreate. Почему мой макет плохо себя ведет?

1 Ответ

1 голос
/ 23 февраля 2020

Проблемы, которые вы описываете, являются известными ошибками.

Вы можете установить тему действия только до того, как onCreate для этого действия произойдет

Таким образом, у вас есть два варианта:

  1. откройте новое действие с указанным фрагментом и установите его тему в манифесте android.

  2. установите тему действия внутри вашего фрагмента, и напишите logi c в oncreate, чтобы отобразить ваш фрагмент, после того, как вы измените тему, вызовите activity.recreate (), которая перезапустит действие и, таким образом, применяет вашу тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...