Как получить значение ListPreference в kotlin деятельности - PullRequest
1 голос
/ 13 февраля 2020

Как я могу получить значение ListPreference выбранного параметра в моей деятельности?

Код

root_preferences.xml

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

    <PreferenceCategory app:title="@string/settings_header">

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

    </PreferenceCategory>

</PreferenceScreen>

arrays.xml

<resources>
    <string-array name="reply_entries">
        <item>English</item>
        <item>Bahasa Indonesia</item>
        <item>فارسی</item>
        <item>العربی</item>
    </string-array>

    <string-array name="reply_values">
        <item>en</item>
        <item>in</item>
        <item>fa</item>
        <item>ar</item>
    </string-array>
</resources>

SettingsActivity.kt

class SettingsActivity : BaseActivity() {

    lateinit var langCode: String

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

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

    //
    private fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
        Log.e("My key:", key) // currently won't print anything
        when (key) {
            "reply" -> {
                Toast.makeText(this, "Reply selected", Toast.LENGTH_SHORT).show()
            }

            "en" -> {
                Toast.makeText(this, "en selected", Toast.LENGTH_SHORT).show()
            }

            "id" -> {
                Toast.makeText(this, "id selected", Toast.LENGTH_SHORT).show()
            }

            "fa" -> {
                Toast.makeText(this, "fa selected", Toast.LENGTH_SHORT).show()
            }

            "ar" -> {
                Toast.makeText(this, "ar selected", Toast.LENGTH_SHORT).show()
            }
        }
    }

1 Ответ

1 голос
/ 13 февраля 2020

Обновление: Я разработал решение, используя DialogFragment:

class LanguageListFragment : DialogFragment() {

        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.select_language, container, false)
        }

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)

            val radioGroup = view.findViewById<RadioGroup>(R.id.lang_radio_group)
            radioGroup.setOnCheckedChangeListener { group, checkedId ->
                when (checkedId) {
                    R.id.ar -> {
                        languageSaved("ar")
                    }
                    R.id.bh -> {
                        languageSaved("bh")
                    }
                    R.id.en -> {
                        languageSaved("en")
                    }
                    //add more if needed..
                }
            }
        }

        fun languageSaved(languageCode: String) {
            val myPref: PrefManager = PrefManager(context!!)
            myPref.language = languageCode

            Toast.makeText(
                activity, "Clicked: Bhasa", Toast.LENGTH_SHORT
            ).show()

            // reset the activity
            ActivityCompat.finishAffinity(activity!!)
            startActivity(Intent(activity!!, MainActivity::class.java))
        }
    }

Просмотр вашего фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 

xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RadioGroup
        android:id="@+id/lang_radio_group"
        android:layout_width="161dp"
        android:layout_height="118dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.184"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.137">

        <RadioButton
            android:id="@+id/ar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Arabic" />

        <RadioButton
            android:id="@+id/bh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bhasa" />

        <RadioButton
            android:id="@+id/en"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="English" />

    </RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>

Используйте этот PrefManager вместо предыдущего:

class PrefManager(private val mContext: Context) {

    private var editor: SharedPreferences.Editor? = null
    private var prefs: SharedPreferences? = null

    private val LANGUAGE = "language"
    private val PREF = "user_info"

    var language: String?
        get() {
            this.prefs = this.mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE)
            return this.prefs!!.getString(LANGUAGE, "en")
        }
        set(language) {
            this.editor = this.mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE).edit()
            this.editor!!.putString(LANGUAGE, language)
            this.editor!!.apply()
        }
}

Конец обновления

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

Настройка правильного прослушивателя: (вы также можете использовать анонимного прослушивателя ..)

import android.content.Context
import android.content.SharedPreferences
import android.util.Log

class PrefManager(private val mContext: Context) {

    private var editor: SharedPreferences.Editor? = null
    private var prefs: SharedPreferences? = null

    private val LANGUAGE = "language"
    private val PREF = "user_info"

    var language: String?
        get() {
            return this.prefs!!.getString(LANGUAGE, "en")
        }
        set(language) {
            this.editor = this.mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE).edit()
            this.editor!!.putString(LANGUAGE, language)
            this.editor!!.apply()
            Log.d("TAG", "Should be saved")
        }

    fun regListener(listener: SharedPreferences.OnSharedPreferenceChangeListener) {
        this.prefs = this.mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE)
        /*this.prefs!!.registerOnSharedPreferenceChangeListener { sharedPreferences: SharedPreferences, s: String ->
            Log.d("TAG", "Listener Fired: $s")
        }*/

        this.prefs!!.registerOnSharedPreferenceChangeListener(listener)

    }

}

Теперь зарегистрируйте свою деятельность там, где необходимо значение:

class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {

    override fun onCreate(savedInstanceState: Bundle?) {
//        val wordViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myPref = PrefManager(this)
        myPref.regListener(this)

        myPref.language = "en"
        myPref.language = "bn"
        myPref.language = "ar"
    }

    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        val firedWithValue = sharedPreferences!!.getString(key, "default value")
        Log.d("TAG", "Fired Pref. $firedWithValue")
    }
}

Теперь, когда мы передаем this в качестве слушателя и реализуем OnSharedPreferenceChangeListener, наш метод OnSharedPreferenceChangeListener() acticvity будет вызываться каждый раз, когда language значение set

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...