#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