Android语言切换LOCALE_CHANGED与CalendarView,kotlin
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import android.widget.CalendarView
import androidx.appcompat.app.AppCompatActivity
import java.util.Locale
class MainActivity : AppCompatActivity() {
private val TAG = "fly"
private var mChangeReceiver: ChangeReceiver? = null
private var mCalendarView: CalendarView? = null
companion object {
var isRestart = false
var mDate: Long? = -1L
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "---")
Log.d(TAG, "onCreate")
setContentView(R.layout.activity_main)
mChangeReceiver = ChangeReceiver(TAG)
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_LOCALE_CHANGED)
registerReceiver(mChangeReceiver, intentFilter)
mCalendarView = findViewById(R.id.calendar_view)
mCalendarView?.setOnDateChangeListener(object : CalendarView.OnDateChangeListener {
override fun onSelectedDayChange(
view: CalendarView,
year: Int,
month: Int,
dayOfMonth: Int
) {
Log.d(TAG, "$year-$month-$dayOfMonth ${mCalendarView?.date}")
mDate = mCalendarView?.date
}
})
if (isRestart) {
Log.d(TAG, "重启,设置历史选择 $mDate")
mDate?.let { mCalendarView?.setDate(it, true, true) }
isRestart = false
}
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume $mDate")
}
override fun onStop() {
super.onStop()
Log.d(TAG, "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy")
unregisterReceiver(mChangeReceiver)
}
private class ChangeReceiver(val tag: String) : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
var action = intent?.action
if (!TextUtils.isEmpty(action)) {
if (action == Intent.ACTION_LOCALE_CHANGED) {
var locale = Locale.getDefault()
Log.d(
tag,
"${locale.country}-${locale.language}"
)
isRestart = true
}
}
}
}
}
如果希望在系统切换语言设置后不让Activity重启,那么在AndroidManifest.xml的配置文件中为当前Activity设置:
android:configChanges="locale|layoutDirection|keyboard"
这样设置后,重新打开activity后,activity不会重启(从onCreate创建),但会走onResume周期。