更新:
我设计了一个解决方案
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而不是之前的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.
因此,我们将使用辅助方法来注册侦听器。然后使用活动或片段注册,您希望在您的回调发生任何变化时调用该活动或片段
共享引用。
.
设置正确的监听器:(您也可以使用匿名监听器。)
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()
每次
language
值是
set