Как использовать DropDownPreference для изменения темы - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу использовать DropDownPreference для своей страницы настроек, но, несмотря на то, что просматривал весь Интернет, похоже, не существует приличного учебника о том, как это сделать. Кто-нибудь знает, что должно идти в методе 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)
    }
}

1 Ответ

0 голосов
/ 30 сентября 2019

Я думаю, вы слишком усложняете это. Нет необходимости вовлекать фрагмент в прослушивание изменений в предпочтениях, которые он не будет обрабатывать, и передавать их обратно в действие. Вы можете зарегистрировать прослушиватель изменения предпочтений для всех предпочтений в своей активности и соответственно ответить на него.

class SettingsActivity : AppCompatActivity(), 
    SharedPreferences.OnSharedPreferenceChangeListener {

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

    override fun onDestroy() {
        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
        //...
        super.onDestroy()
    }

    override fun onSharedPreferenceChanged(_: SharedPreferences, key: String) {
        when (key){
            "preference_dark" -> recreate()
        }
    }
}
...