AppCompatDelegate # setDefaultNightMode () вызывая зависание MainActivity после возврата из SettingsActivity для API 23 - PullRequest
1 голос
/ 03 июня 2019

Я реализовал тему день / ночь для моего приложения и добавил ListPreference в моем PreferencesActivity / Fragment, чтобы изменить его там. Все отлично работает для API 24+, но не для API 23 (это мой минимум).

Проблема: при выборе другой темы в настройках, а затем при возврате к MainActivity, она применяет новую тему и затем зависает.

Я вижу в своем журнале, что MainActivity воссоздает себя, снова проходит жизненный цикл, но вызывает onPause () сразу после последнего onResume ().

Запуск PreferencesActivity из MainActivity:

06-02 23:29:17.795 11783-11783/com.package D/MainActivity: onPause()
06-02 23:29:17.815 11783-11783/com.package D/PreferencesActivity: onResume()
06-02 23:29:18.299 11783-11783/com.package D/RosterParentFragment: saving instance state with 2019-06

Переключение тем:

06-02 23:29:29.853 11783-11783/com.package D/PreferencesFragment: Preference changed with key KEY_DAY_NIGHT_MODE
06-02 23:29:29.856 11783-11783/com.package D/PreferencesActivity: onPause()
06-02 23:29:29.870 11783-11783/com.package D/PreferencesActivity: onResume()

Переключение обратно в режим MainActivity (при нажатии back или home <-): </p>

06-02 23:32:26.209 11783-11783/com.package D/MainActivity: onResume()
06-02 23:32:26.247 11783-11783/com.package D/MainActivity: onPause()
06-02 23:32:26.248 11783-11783/com.package D/RosterParentFragment: saving instance state with 2019-06
06-02 23:32:26.254 11783-11783/com.package D/RosterParentFragment: onCreate()
06-02 23:32:26.254 11783-11783/com.package D/RosterParentFragment: savedInstanceState == Bundle[{android:support:fragments=androidx.fragment.app.FragmentManagerState@9a98da, androidx.lifecycle.BundlableSavedStateRegistry.key=Bundle[{}], SelectedYearMonth=2019-06, android:view_state={2131296460=FragmentPager.SavedState{f01b10b position=113}}}]
06-02 23:32:26.254 11783-11783/com.package D/MainActivity: onCreate()
06-02 23:32:26.266 11783-11783/com.package D/MainActivity: savedInstanceState NOT null
06-02 23:32:26.266 11783-11783/com.package D/MainActivity: got fragment from fragment manager
06-02 23:32:26.268 11783-11783/com.package D/RosterParentFragment: onCreateView()
06-02 23:32:26.353 11783-11783/com.package D/MainActivity: onResume()
06-02 23:32:26.366 11783-11783/com.package D/MainActivity: onPause()

(И это последний onPause (), который, кажется, является виновником - не делать этого для API 24+.)

После этого касание экрана даст

W/ViewRootImpl: Dropping event due to no window focus: MotionEvent

предупреждение и удаление от приложения (например, кнопка домой) дает

Performing pause of activity that is not resumed

Отлично работает для API 24+. Есть идеи?

class PreferencesFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener {
    private val dayNightMode: ListPreference by lazy { findPreference<ListPreference>(Preferences.Key.DAY_NIGHT_MODE)!! }
    private val dayNightModeEntries = App.instance.applicationContext.resources.getStringArray(R.array.preferences_theme_entries)
    private val dayNightModeValues = App.instance.applicationContext.resources.getStringArray(R.array.preferences_theme_values)

    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        when (key) {
            Preferences.Key.DAY_NIGHT_MODE -> {       
                AppCompatDelegate
                    .setDefaultNightMode(
                        Preferences.getCurrentDayNightMode())
            }
        }
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }

    override fun onStart() {
        super.onStart()
        Preferences.default()
            .registerOnSharedPreferenceChangeListener(this)
    }

    override fun onStop() {
        Preferences.default()
            .unregisterOnSharedPreferenceChangeListener(this)
        super.onStop()
    }
}

object Preferences {
    object Key {
        val DAY_NIGHT_MODE: String = "KEY_DAY_NIGHT_MODE"
    }

    fun default(): SharedPreferences = PreferenceManager
       .getDefaultSharedPreferences(App.instance.applicationContext)

    fun getCurrentDayNightMode(): Int {
        if (default().getString(Key.DAY_NIGHT_MODE, null) == null) {
            // no DayNightMode selected - setting to MODE_NIGHT_FOLLOW_SYSTEM
            default().setValue(Key.DAY_NIGHT_MODE, MODE_NIGHT_FOLLOW_SYSTEM.toString())
        }
        return default().getString(Key.DAY_NIGHT_MODE, null)!!.toInt()
    }

    fun setCurrentDayNightMode(mode: Int) {
        AppCompatDelegate.setDefaultNightMode(mode)
        default().setValue(Key.DAY_NIGHT_MODE, mode.toString())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...