2

在创建 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)
                       
                    }
                }
            }
        }
    }
}

单击 that inflates 中的ButtondarkMode会创建一个that inflates 。里面有RadioGroup,里面有单选按钮和单选按钮。当我按上述方式进行操作时,我确认它在单击或单击时从 MainActivity 重新启动。是否可以每次立即应用主题更改或在不关闭对话窗口的情况下单击?viewfragment_myvdialog_darkvselectModelightdarklightdarkligthdark

4

1 回答 1

-1

这可以通过滥用可见性修饰符在 Kotlin 中完成。

创建一个AppCompatExtensions.kt包含以下内容的 Kotlin 文件(如 ):

@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)

这将从需要重新启动的活动列表中删除当前活动。

于 2020-12-16T14:07:27.537 回答