Как предотвратить проблему воссоздания фрагмента при изменении ориентации?

#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) в своей деятельности. Показать еще