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 шт):

Автор решения: Falchio

Вам нужно лучше ознакомиться с Концепцией 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
            }
        });
    }

}

→ Ссылка