Android语言切换LOCALE_CHANGED与CalendarView,kotlin

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周期。

Android重写onConfigurationChanged规避横竖屏切换时候重新进入onCreate生命周期_zhangphil的博客-CSDN博客Android重写onConfigurationChanged规避横竖屏切换时候重新进入onCreate生命周期Android系统内在的机制,当activity在横竖屏切换时候,会强制重新开始进入activity的生命周期onCreate,在有些特殊的场景,开发者不希望重新进入onCreate生命周期,那么,可以通过重写Android的onConfigurationChanged规避。https://blog.csdn.net/zhangphil/article/details/50607742

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/129915107
今日推荐