如何使用DropDownPreference更改主题

问题描述 投票:0回答:1

我想在我的设置页面中使用DropDownPreference,但尽管在Internet上四处浏览,但似乎没有关于此操作的任何不错的教程。有人知道onPreferenceChange方法中应该包含什么吗?我以前使用了RadioButton,但现在想使用DropDownPreference来简化实施和维护。

活动

class SettingsActivity : AppCompatActivity(), FragmentSettings.PreferenceXchangeListener {
    private var mCurrentValue: Boolean = false // False is the default value

    override fun onCreate(savedInstanceState: Bundle?) {
        val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        mCurrentValue = mSharedPreferences.getBoolean("preference_dark", false)

        if (mCurrentValue) {
            setTheme(R.style.MyDarkSettingsTheme)
        } else {
            setTheme(R.style.MyLightSettingsTheme)
        }

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


        val viewllSettingsContainer = settings_container
        val root = viewllSettingsContainer.rootView


        if (mCurrentValue) {
            root.setBackgroundColor(Color.BLACK)
        } else {
            root.setBackgroundColor(Color.WHITE)
        }

        val settingsFragment = FragmentSettings()
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings_container, settingsFragment)
            .commit()
    }


    override fun onXchange(value:Boolean) {
        when {
            mCurrentValue != value -> {
                mCurrentValue = value
                recreate()
            }
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            android.R.id.home -> {
                val intent = parentActivityIntent
                intent?.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                onBackPressed()
                true
            }

            else ->
                super.onOptionsItemSelected(item)
        }
    }
}

片段

class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener,
    Preference.OnPreferenceClickListener {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        addPreferencesFromResource(R.xml.app_preferences)

        val mDropDownPreference = findPreference<Preference>("preference_dark") as DropDownPreference
        mDropDownPreference.onPreferenceChangeListener = this
    }

    // Declaring PreferenceXchangeListener
    private var mPreferenceXchangeListener: PreferenceXchangeListener? = null

    // Declaring PreferenceXchangeListener in order to communicate with Activities
    interface PreferenceXchangeListener {
        fun onXchange(value:Boolean)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        // On attach - assign parent Activity as PreferenceXchangeListener
        try
        {
            mPreferenceXchangeListener = context as PreferenceXchangeListener
        }
        catch (e:ClassCastException) {
            Log.e(TAG, "onAttach::::: PreferenceXchangeListener must be set in parent Activity")
        }
    }

    override fun onPreferenceChange(preference: Preference, newValue:Any):Boolean {
        return if (preference.key == "preference_dark") {
            (preference as RadioButtonPreference).isChecked = newValue as Boolean

            // Executing parent Activity's callback with the new value
            mPreferenceXchangeListener!!.onXchange(newValue)
            true
        }

        // ... check other preferences here
        else false
    }

    override fun onPreferenceClick(preference: Preference): Boolean {
        if (preference is DropDownPreference)

        if (preference.key == "preference_dark") {
            activity!!.setTheme(R.style.DarkTheme)
            activity!!.recreate()
        } else {
            activity!!.setTheme(R.style.LightTheme)
            activity!!.recreate()
        }

        return true
    }

    companion object {
        private val TAG = SettingsFragment::class.java.simpleName
    }
}
android kotlin android-preferences preferenceactivity android-settings
1个回答
0
投票

我认为您过于复杂了。无需让片段参与侦听将不会处理的首选项的更改并将其传递回活动。您可以为“活动”中的所有首选项注册一个首选项更改侦听器,然后在其中做出相应的响应。

class SettingsActivity : AppCompatActivity(), 
    SharedPreferences.OnSharedPreferenceChangeListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        mSharedPreferences.registerOnSharedPreferenceChangeListener(this)
        //...
    }

    override fun onDestroy() {
        mSharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
        //...
        super.onDestroy()
    }

    override fun onSharedPreferenceChanged(_: SharedPreferences, key: String) {
        when (key){
            "preference_dark" -> recreate()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.