Как сохранить диалоговое окно открытым для действия во время обновления действия (смена темы приложения)?

#java #android #kotlin #android-activity #android-dialog

#java #Android #kotlin #android-активность #android-диалог

Вопрос:

У меня есть Settings.kt действие, в котором есть функция изменения темы для моего приложения.
При нажатии на опцию темы themeDialog на экране появляется окно, и с помощью переключателя тему можно изменить, как показано на рисунке ниже.

И теперь, чтобы отразить эти изменения в Settings.kt действии, а также в themeDialog я обновляю Settings.kt действие с помощью намерения, и в результате эта тема меняется должным образом, но themeDialog закрывается одновременно с обновлением действия.

Поэтому я прошу способ сохранить диалоговое окно открытым во время обновления темы Settings.kt действия и themeDialog окна.

Вот мой код:

Settings.kt Активность

 class Settings : AppCompatActivity() {

    private lateinit var settingsRecyclerView: RecyclerView
    private lateinit var settingsAdapter: SettingsAdapter
    private lateinit var sharedPrefForNightMode: SharedPrefForNightMode

    override fun onCreate(savedInstanceState: Bundle?) {

        sharedPrefForNightMode = SharedPrefForNightMode(this)
        if (sharedPrefForNightMode.loadNightModeState()) {
            setTheme(R.style.DarkTheme)
        } else setTheme(R.style.AppTheme)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        settingsAdapter = SettingsAdapter(this)
        settingsRecyclerView = findViewById(R.id.settings_recycler_view)
        settingsRecyclerView.layoutManager = LinearLayoutManager(this)
        settingsRecyclerView.setHasFixedSize(true)
        settingsRecyclerView.adapter = settingsAdapter
    }

    override fun finish() {
        super.finish()
        overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right)
    }
    override fun onBackPressed() {
        super.onBackPressed()
        val intent = Intent(this,Dashboard::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(intent)
        finish()
    }
}
  

SettingsAdapter.kt — В этом адаптере у меня есть функция theme(context:Context) , которая создает my themeDialog , а restartSettings() функция обновляет Settings.kt действие:

 class SettingsAdapter(private val mContext: Context) :
    RecyclerView.Adapter<SettingsAdapter.SettingsViewHolder>() {    
private fun theme(context: Context) {
            val themeDialog = Dialog(context)
            themeDialog.setContentView(R.layout.theme_popup)
            themeDialog.setCancelable(false)
            themeDialog.show()
            val themeTitle = themeDialog.findViewById<TextView>(R.id.theme_title)
            val closeTheme = themeDialog.findViewById<Button>(R.id.close_theme)
            closeTheme.setOnClickListener {
                themeDialog.dismiss()
            }
            val switch = themeDialog.findViewById<Switch>(R.id.dark_mode_switch)
            if(sharedPrefForNightMode.loadNightModeState()) {
                switch.isChecked = true
                themeTitle.text = "Disable Night Mode"
            }
            switch.setOnCheckedChangeListener { _, _ ->
                if (switch.isChecked) {
                    sharedPrefForNightMode.setNightModeState(true)
                    themeTitle.text = "Disable Night Mode"
                    restartSettings()
                } else {
                    sharedPrefForNightMode.setNightModeState(false)
                    themeTitle.text = "Enable Night Mode"
                    restartSettings()
                }
            }
        }
    
        private fun restartSettings() {
            mContext.startActivity(Intent(mContext, Settings::class.java))
            (mContext as Activity).overridePendingTransition(R.anim.fadein, R.anim.fadeout)
            mContext.finish()
            mContext.overridePendingTransition(R.anim.fadein, R.anim.fadeout)
        }
}
  

Комментарии:

1. Если вам нужен весь код для SettingsAdpater дайте мне знать, я только что опубликовал функции, связанные с этим вопросом

2. A Dialog принадлежит Activity экземпляру. Вы уничтожаете и воссоздаете действие, так что это уничтожит Dialog . Вам нужно будет воссоздать Dialog себя в новом Activity экземпляре.

3. Да, но это не будет удерживать диалоговое окно для действия во время его обновления

4. Затем вам нужно будет сделать что-то, что не предполагает уничтожения и воссоздания вашего действия, чтобы повлиять на желаемые изменения.

5. вы должны поделиться функцией setTheme