Как правильно использовать viewLifecycleOwner в MainActivity?

#kotlin #android-fragments #android-lifecycle #observers

#kotlin #android-фрагменты #android-жизненный цикл #наблюдатели

Вопрос:

Я пытаюсь выяснить, как правильно использовать viewLifecycleOwner в MainActivity, я прочитал, и мне сказали, что жизненные циклы используются с фрагментами. Однако я не реализую фрагменты в своем приложении. При добавлении наблюдателей в код я использую «this» вместо viewLifecycleOwner . Это не приведет к возникновению каких-либо ошибок, но в конечном итоге не будет работать, поскольку оно неправильно связывает данные на виртуальном устройстве (при запуске приложения отображается только пустая страница для приложения без данных или изображений). Пока что в MainActivity у меня есть следующий код.

 class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: DrinkViewModel

    // Contains all the views
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        // Use Data Binding to get reference to the views
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        binding.drinkButton.setOnClickListener {
            onDrinkClicked()
        }

        viewModel.revenue.observe(this, Observer { newRevenue ->
            binding.revenueText.text = newRevenue.toString()
        })

        viewModel.drinksSold.observe(this, Observer { newAmount ->
            binding.amountSoldText.text = newAmount.toString()
        })
    }
}
 

Комментарии:

1. Похоже, вы не устанавливаете данные и изображения

2. Привет, спасибо за комментарий. Разве наблюдатель не обновил бы изображения и данные при появлении изменений?

3. это зависит от вашего кода ViewModel, который не является частью вопроса

4. Как вы упоминали ранее, я допустил ошибку при настройке данных и изображений. Я неосторожно попытался вернуть числа в строках. Хотя он не выдавал ошибку, он не отображал данные. Я также неправильно пытался связать числа как тексты. Спасибо за вашу помощь

Ответ №1:

После комментария EpicPandaForce я сосредоточился на том, правильно ли я связал данные и изображения. Я понял, что это не так. Я ошибочно привязывал доход и суммы, проданные как тексты. Я также пытался установить newRevenue и newAmount для строк. Предполагалось, что выручка и проданные суммы будут передаваться как целые числа. Следующий код является правильным.

 class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: DrinkViewModel

    // Contains all the views
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        // Use Data Binding to get reference to the views
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        binding.drinkButton.setOnClickListener {
            onDrinkClicked()
        }

        viewModel.revenue.observe(this, Observer { newRevenue ->
            binding.revenue = newRevenue
        })

        viewModel.drinksSold.observe(this, Observer { newAmount ->
            binding.drinkSold = newAmount
        })
    }
}