【问题标题】:How to implement the ViewModel to save the state如何实现 ViewModel 保存状态
【发布时间】:2021-07-05 00:22:07
【问题描述】:

所以我尝试在我的应用程序上实现 viewModel,但它仍然以相同的方式运行。 我想保存我的游戏的当前视图,但是由于应该保存的部分是在一个保存视图的函数中,所以我无法移动它。

这是一些代码。

片段

class GamePlay1Fragment : Fragment() {

//    lateinit var front_anim: AnimatorSet
//    lateinit var back_anim: AnimatorSet

    private lateinit var viewModel: GP1ViewModel
    private lateinit var pieces: List<ImageView>



    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding: Gameplay1FragmentBinding = DataBindingUtil.inflate(
            inflater,
            R.layout.gameplay1_fragment,
            container, false)



        viewModel = ViewModelProvider(this).get(GP1ViewModel::class.java)


        binding.backButtonView.setOnClickListener { v: View ->
            v.findNavController().navigate(GamePlay1FragmentDirections.actionGamePlay1FragmentToLobbyFragment())
        }


        pieces = listOf(binding.card1back, binding.card2back, binding.card3back, binding.card4back,
            binding.card5back,binding.card6back, binding.card7back,
            binding.card8back, binding.card9back, binding.card10back, binding.card11back,
            binding.card12back)

        viewModel.gameCards = pieces.indices.map { index ->
            GameCard(viewModel.images[index])
        }


            pieces.forEachIndexed { index, piece ->
                piece.setOnClickListener {

                    viewModel.updatingModels(index)

                    updatingViews()
                }
            }



        return binding.root
    }

    private fun updatingViews() {
        viewModel.gameCards.forEachIndexed { index, gameCard ->
            val piece = pieces[index]
            piece.setImageResource(if (gameCard.isFacedUp) gameCard.id else allcardbacks)
        }
    }


}

视图模型

class GP1ViewModel() : ViewModel() {

        lateinit var gameCards: List<GameCard>
        private var indexOfSelectedPiece: Int? = null



    val images = mutableListOf(
        R.drawable.memorybatcardfront,
        R.drawable.memorycatcardfront,
        R.drawable.memorycowcardfront,
        R.drawable.memorydragonfront,
        R.drawable.memorygarbagemancardfront,
        R.drawable.memoryghostdogcardfront
    )

    init {
        images.addAll(images)
        images.shuffle()
        Log.e(TAG, "ViewModel Created:")
    }






     fun updatingModels(position: Int) {
        val gameCard = gameCards[position]

        if (gameCard.isFacedUp) return


        if (indexOfSelectedPiece == null) {
            restoreGameCards()
            indexOfSelectedPiece = position

        }
        else {
            checkingForMatch(indexOfSelectedPiece!!, position)
            indexOfSelectedPiece = null
        }
        gameCard.isFacedUp = !gameCard.isFacedUp
    }

    private fun restoreGameCards() {
        val handler = Handler()
        for (gameCard in gameCards) {
            if (!gameCard.isMatched) {
                handler.postDelayed(runnable, 1000)
                gameCard.isFacedUp = false

            }

        }
    }

    private fun checkingForMatch(position1: Int, position2: Int) {
        if (gameCards[position1].id == gameCards[position2].id) {
            gameCards[position1].isMatched = true
            gameCards[position2].isMatched = true
        }
    }

    private val runnable = Runnable(){
        kotlin.run {
        }
    }


}

我假设需要保存的部分是片段中的更新视图(),但我无法移动它,因为它还处理图像视图数组(S.O.C)。欢迎任何想法,谢谢。

【问题讨论】:

标签: android android-studio android-fragments android-viewmodel android-savedstate


【解决方案1】:

您的 viewModel 正在使用片段引用。相反,它应该使用活动引用。

viewModel = ViewModelProvider(this).get(GP1ViewModel::class.java)

由于您使用的是片段引用,一旦片段被销毁,它将被销毁,因此数据不会被持久化。

需要注意的另一点是,如果您愿意,可以使用 SharedViewModel 方法在多个片段实例之间共享数据。

【讨论】:

  • 所以我应该在 Activity 上调用 viewModel 类吗?
  • 不一定。您始终在片段中有活动上下文。你可以用那个。例如,片段内的 getActivity() 调用将为您提供活动。 Activity 是一个上下文(因为 Activity 扩展了 Context)。
猜你喜欢
  • 2020-09-20
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2019-07-17
  • 2014-08-13
  • 2021-03-30
相关资源
最近更新 更多