#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()
общедоступным не обязательно — средство доступа по умолчанию подходит, поскольку оба класса находятся в одном пакете.