Я не могу получить доступ к данным, хранящимся в классе ViewModel

#android #android-studio #model-view-controller #viewmodel

#Android #android-studio #model-view-controller #viewmodel

Вопрос:

Я учусь использовать View Model в Android, и я не смог получить доступ к переменным, которые я сохранил в своем классе View Model. Для простоты я создал новый проект, чтобы попытаться реализовать простое приложение счетчика, но и здесь я сталкиваюсь с той же проблемой.

Я не могу получить доступ к своим данным в классе View Model с моего контроллера пользовательского интерфейса. Кто-нибудь может помочь?

Моя модель представления

 package com.example.smish_hash20;
import androidx.lifecycle.ViewModel;

public class myViewModel extends ViewModel {
    int num = 0;
    void addNum(){
        num  ;
    }
}
  

Основная деятельность

 package com.example.smish_hash20;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    int num = 0;
    ViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);
        final TextView textView = findViewById(R.id.textView);
        viewModel = new ViewModelProvider(this).get(myViewModel.class);

        textView.setText(String.valueOf(viewModel.num));

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewModel.addNum();
                textView.setText(String.valueOf(viewModel.num));
            }
        });
    }
}
  

Здесь Android Studio показывает ошибку, что num и addNum() не распознаются.

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

1. Попробуйте добавить «public» перед int и перед void, чтобы сделать их доступными.

Ответ №1:

Вы объявили свою модель представления как базовый тип ViewModel , что означает, что вы сможете взаимодействовать с объектом как с базовым типом только после его инициализации (технически вы могли бы выполнить приведение, но давайте не будем идти по этому пути).

Вы должны заменить эту строку :

ViewModel viewModel;

С вашим подтипом :

myViewModel viewModel;

Делать метод addNum() общедоступным не обязательно — средство доступа по умолчанию подходит, поскольку оба класса находятся в одном пакете.