当初始化时,DropDownPreference setOnPreferenceChangeListener会自己调用。

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

我已经提交了 窃听 关于这个问题,我认为是一个平台错误。如果你有一个DropDownPreference OnPreferenceChangeListener,Android会出现 "选择 "第一个项目一次,而且只有一次,当屏幕第一次在一个新的应用程序上打开时,从而触发监听器。

有没有人见过这种行为,我如何防止它?我试过放入一个布尔偏好标志来过滤掉误发,但现在我的下拉菜单中的第一个选项是不可选择的,直到我选择另一个选项。我相信在幕后 PreferenceFragmentCompat 认为下拉菜单中的第一个选项是 "默认的",而我已经尝试使用了 setDefaultValuesetValueIndex 上的首选项,并尝试以编程方式初始化它,但无济于事。xml首选项没有设置默认值。

我的下拉首选项叫做 "准备时间",它的初始值来自我们的服务器,然后来自本地数据库。

val setting = settings.getSettingByName(preferencesHelper.merchantBranchID, AppConstants.Settings.PREP_TIME)

    if (setting != null) {
        var prepTime = setting.value
        if (prepTime.isEmpty()) {
            prepTime = "15"
        }

        val summaryProvider = Preference.SummaryProvider<DropDownPreference> {
            if (prepTime.toInt() == 1)
                "$prepTime minute"
            else
                "$prepTime minutes"
        }

        val preference = findPreference<DropDownPreference>(AppConstants.Settings.PREP_TIME)
        withContext(Dispatchers.Main) {
            preference?.summaryProvider = summaryProvider
            preference?.setDefaultValue(setting.value)
        }

        preference?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { pref, newValue ->

            if(prefs.prepTimePreferenceInittedDueToPlatformBug) {
                updateSetting(groupID, branchID, setting.id, newValue.toString())
                        .observe(viewLifecycleOwner, Observer { response ->
                            response?.let {
                                Timber.i("Settings put observed, status= " + response.status + ", data=" + response.data)
                        })

                prepTime = newValue.toString()
            }
            else{
                //We need to do this to prevent a false positive for new installs.
                //Dropdown preferences exhibit this, which I think is a platform bug, reported:
                //https://issuetracker.google.com/issues/156047817
                prefs.prepTimePreferenceInittedDueToPlatformBug = true
            }
            true
        }
    }
android android-preferences
1个回答
0
投票

据我所知,这与Spinners有关。有些东西在不该触发的时候触发了它,如果它是 这个毛病 就不会被修复。这个有很多可笑的小技巧。这是我从那里的一个答案延伸出来的解决方案。

var actualSpinnerClick = false;
preference?.onPreferenceClickListener = Preference.OnPreferenceClickListener {
    actualSpinnerClick = true
    true
}

preference?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { pref, newValue ->
    if(actualSpinnerClick) {
        actualSpinnerClick = false;
        updateSetting(groupID, branchID, setting.id, newValue.toString())
                .observe(viewLifecycleOwner, Observer { response ->
                    response?.let {
                        Timber.i("Settings put observed, status= " + response.status + ", data=" + response.data)
                    }
                })

        prepTime = newValue.toString()
    }
    true
}
© www.soinside.com 2019 - 2024. All rights reserved.