#android #mvvm #rotation #fragment #kotlin-coroutines
#Android #mvvm #вращение #фрагмент #kotlin-сопрограммы
Вопрос:
В моем приложении я использую панель навигации с навигационным компонентом и архитектурой mvvm.
Моя проблема заключается в том, что при повторном создании фрагмента поворота экрана. Как это предотвратить? Пожалуйста, какие-либо советы или примеры кода?
Мой код похож :
Основная деятельность :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
drawerLayout = findViewById(R.id.drawer_layout)
navView = findViewById(R.id.nav_view)
navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_home,
R.id.nav_productInsight,
R.id.nav_turkey,
R.id.nav_usa,
R.id.nav_china
), drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
navView.setNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.nav_home -> {
navController.navigate(R.id.nav_home)
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
}
true
}
R.id.nav_productInsight -> {
navController.navigate(R.id.nav_productInsight)
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
}
true
}
R.id.nav_turkey -> {
val menuItemView = findViewById<View>(R.id.nav_turkey)
showPopupTurkey(menuItemView)
false
}
R.id.nav_usa -> {
val menuItemView = findViewById<View>(R.id.nav_usa)
showPopupUsa(menuItemView)
false
}
R.id.nav_china -> {
val menuItemView = findViewById<View>(R.id.nav_china)
showPopupChina(menuItemView)
false
}
R.id.nav_logout -> {
showLogOutDialog()
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
}
true
}
else -> {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
}
false
}
}
}
}
ViewModelClass :
class HomeViewModel @ViewModelInject constructor(
private val dataUseCase: DataUseCase,
private val networkHelper: NetworkHelper
):ViewModel(){
fun getCountryProductionInformationChartList (filterId : String?,productId:String?) : LiveData<ResultData<BaseChartModel<ProductionQuantityModel>?>> {
return flow {
emit(ResultData.Loading())
try {
emit(dataUseCase.getCountryProductionInformationChartList (filterId,productId))
} catch (e: Exception) {
e.printStackTrace()
emit(ResultData.Exception())
}
}.asLiveData(Dispatchers.IO)
}
}
Мой домашний фрагмент :
@AndroidEntryPoint
class HomeFragment : BaseFragment() {
private lateinit var mContext: Context
private lateinit var mView : View
private val mainViewModel: HomeViewModel by viewModels()
private val mainObserver = Observer<ResultData<BaseChartModel<ProductionQuantityModel>?>> { resultData ->
when(resultData) {
is ResultData.Loading -> {
mView.scrollView.visibility = View.GONE
emptyDataText.visibility = View.GONE
showLoading()
}
is ResultData.Success -> {
hideLoading()
mView.scrollView.visibility = View.VISIBLE
emptyDataText.visibility = View.GONE
resultData.data?.let {
setQtyChart(mView, it)
setPPMChart(mView, it)
setKPIChart(mView, it)
setBreakDownChart(mView, it)
}
}
is ResultData.Failed -> {
hideLoading()
mView.scrollView.visibility = View.GONE
emptyDataText.visibility = View.VISIBLE
emptyDataText.text = resultData.message
}
is ResultData.Exception -> {
hideLoading()
mView.scrollView.visibility = View.GONE
emptyDataText.visibility = View.GONE
Toast.makeText(mContext,"Error!",Toast.LENGTH_SHORT).show()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_home, container, false)
mView = root
getProductionQuantities()
return root
}
Как справиться с этой проблемой повторного создания?
Кстати, данные безопасных аргументов исчезают.
Ответ №1:
Вы могли бы использовать setRetainInstanceState(true)
в своей деятельности. Показать еще