Обновление: Я разработал решение, используя 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