Hey I am working on androidx fragment. I want to ask is there any way to restore state of fragment in middle of language change configuration. For example I have 1 activity and 4 fragments.
Activity
1st Fragment > 2 Fragment > 3 Fragment > 4 Fragment
Like this I have fragments in single activity. In 1st Fragment I am calling 3 api call through retrofit. I have some callbacks in each fragments. In 1st Fragment I have 2 callback which execute api calls.
Also I have logic to jump directly in 3 Fragment with calling each fragment to go and showing loading spinner to user. Now main scenario starts.
when I am in 3rd Fragment. I change my device language and my 1st fragment callback not called and the result is blank screen. So I am thinking to store my fragment state and restore when created the activity may be that would help me.
Please I checked this answer. I read somewhere Is to use viewmodel to save state of fragment. Using koin for Dependency Injection for my viewmodel. I need latest answer and how to store whole fragment instance?. Please don't add link of google doc. I already tried from there and it didn't work for me. Thanks
activity.kt
class StepsBaseActivity : : AppCompatActivity() {
internal lateinit var binding: ctivityLayoutBinding
private val viewModel: ActivityViewModel by inject()
var fragment: Fragment? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupViewModel()
binding = ActivityLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
loadScreensList()
}
private fun setupViewModel() {
viewModel.infoLiveData.observe(this, { info ->
info?.let{
switchFragment(info)
}
}
})
}
private fun loadScreensList() {
viewModel.setupScreenSteps()
}
private fun switchFragment(data: FragmentStepData, arguments: Bundle? = null) {
fragment = supportFragmentManager.findFragmentByTag(data.tag)
if (fragment == null) {
fragment = getFragmentForScreen(data)
if (fragment != null) {
arguments?.let {
fragment?.arguments = arguments
}
supportFragmentManager
.beginTransaction()
.replace(
R.id.fragment_container, fragment!!,
data.tag
)
.addToBackStack(null)
.commitAllowingStateLoss()
}
}
}
fun getFragmentForScreen(data: FragmentStepData): FragmentBase{
return when (getScreen(data.screen)) {
Screen.FRAGMENT_ONE -> FragmentOne()
..... // till 4
null -> null
}
}
}
ActivityViewModel.kt
class ActivityViewModel : ViewModel {
val infoLiveData = MutableLiveData<StepsInfo>()
fun setupScreenSteps() {
viewModelScope.launch {
val list = mutableListOf<StepsInfo>()
list.add(StepsInfo(Screen.FRAGMENT_ONE , "fragment_one"))
list.add(StepsInfo(Screen.FRAGMENT_TWO , "fragment_two"))
list.add(StepsInfo(Screen.FRAGMENT_THREE , "fragment_three"))
list.add(StepsInfo(Screen.FRAGMENT_FOUR , "fragment_four"))
infoLiveData.postValue(list)
}
}
fun fetchFirstFragmentApiCall(){
// Through retrfoit
}
// All fragment api call
}
StepsInfo.kt
data class StepsInfo(val screen: Screen, val tag: String)
Screen.kt
enum class Screen{
FRAGMENT_ONE,
FRAGMENT_TWO,
FRAGMENT_THREE,
FRAGMENT_FOUR
}