在创建Android应用程序时,我想创建一个函数,允许您在从片段创建的对话框窗口中设置暗模式。由于找到了设置暗模式的方法,几乎所有开发人员都使用重新启动活动。有没有办法在不重新启动的情况下立即应用暗模式?这是我当前使用的片段内对话框窗口中的暗模式应用程序代码。
class MyFragment : Fragment() {
private var dialog: AlertDialg? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_my, container, false)
if (AppCompatDelegete.getDefulatNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
context!!.setTheme(R.style.DarkTheme)
} else {
context!!.setTheme(R.style.LightTheme)
}
view.darkMode.setOnClickListener {
val v = LayoutInfalter.from(context).inflate(R.layout.dialog_dark, null)
builder.setView(v)
dialog = builder.create()
dialog.show()
v.selectMode.setOnCheckedChangeListener { _, id ->
when (id) {
R.id.light -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
val intent = Intent(context, MainActivity::class.java)
startActivity(intent)
}
R.id.dark -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
val intent = Intent(context, MainActivity::class.java)
startActivity(intent)
}
}
}
}
}
}
单击view
中的darkMode
按钮,使fragment_my
v
dialog_dark
膨胀。在v
里面,有由RadioGroup制成的selectMode
,里面有light
单选按钮和dark
单选按钮。当我如上所述时,我确认当单击light
或dark
时,它会从主活动重新启动。是否可以在不关闭对话框窗口的情况下,每次单击ligth
或dark
时立即应用主题更改?
这可以在 Kotlin 中通过滥用可见性修饰符来完成。
创建一个包含以下内容的 Kotlin 文件(如AppCompatExtensions.kt
(:
@file:Suppress("PackageDirectoryMismatch")
package androidx.appcompat.app
/**
* Misuses a package-private function to remove an activity
*/
fun doNotRestartThisActivity(activity: AppCompatActivity) {
AppCompatDelegate.removeActivityDelegate(activity.delegate)
}
现在在您的活动中,在调用AppCompatDelegate.setNightMode(MODE)
调用新方法之前:
doNotRestartThisActivity(this)
这将从需要重新启动的活动列表中删除当前活动。