Android studio. Как сделать переключение между xml в шаблоне bottom navigation views activity
В общем мне нужно сделать так, чтобы отображалась эта страница:
То что отмечено красным должно отображаться, а отображается то, что белым цветом. В TriangleViewModel.java такой код:
package com.dorofeev.geometry.ui.triangle;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class TriangleViewModel extends ViewModel {
private final MutableLiveData<String> mText;
public TriangleViewModel() {
mText = new MutableLiveData<>();
mText.setValue("This is Triangle fragment");
}
public LiveData<String> getText() {
return mText;
}
}
Как это можно реализовать?
Ответы (1 шт):
Вам нужно лучше ознакомиться с Концепцией ViewModel.
Сама по себе ViewModel
не отображает данные, ViewModel
данные кэширует для отображения. Отображает данные слой View
. В случае с андроид это Activity
и Fragment
. Для того, чтобы Activity
и Fragment
могли получить доступ к данным из ViewModel
эти данные должны быть им доступны.
Давайте попробуем доработать Ваш класс TriangleViewModel
. Что с ним не так?
Немного в сторону - это вкусовщина, наверное, но я бы рекомендовал не использовать венгерскую нотацию для названия переменных.
Поле mText
недоступно никому кроме данного класса, поскольку имеет модификатор видимости private
. Но просто поменять private
на public
тоже недостаточно. Так как тип переменной mText
- MutableLiveData
, это означает, что в переменную mText
смогут писать и другие классы, что нарушает принцип инкапсуляции. Сделаем переменную public
, но read-only
, создав новую переменную, ссылающуюся на mText
, но уже с типом LiveData
. Из LiveData
тоже можно читать, но не записывать в неё новые значения. Поле mText
же оставим неизменным. Иначе как мы будем записывать новое значение.
TriangleViewModel:
package com.dorofeev.geometry.ui.triangle;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class TriangleViewModel extends ViewModel {
private final MutableLiveData<String> mText;
public final LiveData<String> text = mText;
public TriangleViewModel() {
mText = new MutableLiveData<>();
mText.setValue("This is Triangle fragment");
}
public LiveData<String> getText() {
return mText;
}
}
примерный TriangleFragment:
public class TriangleFragment extends Fragment {
private TriangleViewModel viewModel;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Initialize the ViewModel
viewModel = new ViewModelProvider(requireActivity()).get(TriangleViewModel.class);
// Observe the LiveData
viewModel.text.observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String value) {
// тут надо присвоить новое значение TextView c id - text_triangle
}
});
}
}