Изменения ListPreference игнорируются в Kotlin - PullRequest
0 голосов
/ 06 октября 2019

Почему мой ListPreference не выполняет требуемые действия при изменении предпочтения? Я следовал за этим видеоуроком , но по какой-то причине слушатель не работает. Я не видел никаких рабочих руководств в Kotlin о том, как это сделать.

root_preferences.xml

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">

    <ListPreference
        app:defaultValue="reply"
        app:entries="@array/reply_entries"
        app:entryValues="@array/reply_values"
        app:key="list_reply"
        app:title="@string/reply_title"
        app:useSimpleSummaryProvider="true" />

</PreferenceScreen>

arrays.xml

<resources>
    <!-- Reply Preference -->
    <string-array name="reply_entries">
        <item>Reply</item>
        <item>Reply to all</item>
    </string-array>

    <string-array name="reply_values">
        <item>reply</item>
        <item>reply_all</item>
    </string-array>
</resources>

Активность

class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.settings_activity)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings, SettingsFragment())
            .commit()
        supportActionBar?.setDisplayHomeAsUpEnabled(true)

       val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
       sharedPreferences.registerOnSharedPreferenceChangeListener(this)
    }

    class SettingsFragment : PreferenceFragmentCompat() {
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey)
        }
    }

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

    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
        when (key){
            "reply" -> {
                Toast.makeText(this, "Reply selected", Toast.LENGTH_SHORT).show()
            }

            "reply_to_all" -> {
                Toast.makeText(this, "Reply To All selected", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 октября 2019

У вас есть:

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    when (key){
        "reply" -> {
            Toast.makeText(this, "Reply selected", Toast.LENGTH_SHORT).show()
        }

        "reply_to_all" -> {
            Toast.makeText(this, "Reply To All selected", Toast.LENGTH_SHORT).show()
        }
    }
}

Это будет вызвано, когда значение в вашем SharedPreferences изменится. key - это ключ, связанный с измененным значением предпочтения. В случае, если на экране отображается SharedPreferences, эта клавиша вводится с android:key или app:key.

В вашем случае ваш app:key равен list_reply:

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">

    <ListPreference
        app:defaultValue="reply"
        app:entries="@array/reply_entries"
        app:entryValues="@array/reply_values"
        app:key="list_reply"
        app:title="@string/reply_title"
        app:useSimpleSummaryProvider="true" />

</PreferenceScreen>

Ваша onSharedPreferenceChanged() функция прямо сейчас полностью игнорирует это, поскольку вы не ищете list_reply. Вам нужно добавить ветку к существующей when, чтобы покрыть list_reply, например:

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    when (key){
        "reply" -> {
            Toast.makeText(this, "Reply selected", Toast.LENGTH_SHORT).show()
        }

        "reply_to_all" -> {
            Toast.makeText(this, "Reply To All selected", Toast.LENGTH_SHORT).show()
        }

        "list_reply" -> {
            Toast.makeText(this, "The user chose something from the ListPreference -- get the updated value from the SharedPreferences", Toast.LENGTH_SHORT).show()
        }
    }
}

И, если reply и reply_to_all не являются действительно ключами, вы можете сделать что-то вроде:

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    when (key) {
        "list_reply" -> {
            if (sharedPreferences.getString(key, "reply") == "reply") {
              // TODO
            }
            else {
              // TODO
            }
        }
    }
}
0 голосов
/ 06 октября 2019

reply и reply_to_all не являются ключами настроек. Ключ вашего предпочтения list_reply. Вы можете использовать способ, подобный этому.

       when (key){
            "list_reply" -> {
                val preference = sharedPreferences as? ListPreference
                if(preference?.value.equals("reply")){
                    //Your code
                }else if(preference?.value.equals("reply_all")){
                    //Your code
                }
            }

        }
...