Использование двух ViewModel для получения разных типов данных из фрагментов в AndroidStudio - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в этом и нуждаюсь в помощи. Я пытаюсь получить LiveData из разных фрагментов, используя два ViewModels.

  1. DayViewModel отлично работает. Он собирает CharSequence ввод из DayFragment, а затем передает его MainActivity, откуда я могу получить данные для использования в разных фрагментах.
  2. MediaRecorderViewModel использует ту же методологию.

Журналы показывают, что MediaRecorderViewModel правильно собирает CharSequence из разных фрагментов, но в MainActivity! Что я делаю не так? Код ViewModels и MainActivity добавлен ниже.

DayViewModel:

import android.util.Log;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class DayViewModel extends ViewModel {


    private MutableLiveData<CharSequence> selected = new MutableLiveData<> ();

    public void setData(CharSequence dIndex) {
        selected.setValue (dIndex);
        Log.d("MessageI", "selected: " + dIndex);
    }

    public LiveData<CharSequence> getDayIndex() {
        Log.d("LiveView1", "selected: " + selected);
        return selected;

    }


}

MediaRecorderViewModel:

import android.util.Log;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MediaRecorderViewModel extends ViewModel {


    private MutableLiveData<CharSequence> selected = new MutableLiveData<> ();

    public void setMasterRecording(CharSequence input) {
        selected.setValue (input);
        Log.d("Message", "selected: " + input);
    }

    public LiveData<CharSequence> getValue() {
        Log.d("LiveView", "selected: " + selected.toString ());
        return selected;

    }

}

MainActivity:

public class MainActivity extends AppCompatActivity {
    private DayViewModel dayViewModel;
    private MediaRecorderViewModel mediaRecorderViewModel;
    public int j = 0;
    public String newRecording;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction()
            // adding the three fragments to activity_main
            .add(R.id.phrase_fragment_container, new PhrasesFragment())
            .add(R.id.media_fragment_container, new MediaRecorderFragment())
            .add(R.id.days_fragment_container, new DaysFragment())
            .commit();

        mediaRecorderViewModel = new ViewModelProvider(this).get(MediaRecorderViewModel.class);
        mediaRecorderViewModel.getValue().observe(this, new Observer < CharSequence > () {
            @Override
            public void onChanged(CharSequence c) {
                CharSequence rec = c;
                newRecording = String.valueOf(c);

                //*this one does not work*
                Log.d("Rec", "newRecording: " + rec);
            }
        });

        dayViewModel = new ViewModelProvider(this).get(DayViewModel.class);
        dayViewModel.getDayIndex().observe(this, new Observer < CharSequence > () {
            @Override
            public void onChanged(CharSequence charSequence) {
                CharSequence newDay = charSequence;
                int dayIndex = Integer.parseInt(newDay.toString());
                if (Integer.toString(dayIndex) != null) {
                    j = dayIndex;

                    // this one works fine
                    Log.d("JValue", "J: " + newDay + "dayIndexCharSeq: " + dayIndex);
                }

                Log.d("Convert", "newDay value is: " + dayIndex);
            }
        });

        // instantiate BottomNav        
        BottomNavigationView navView = findViewById(R.id.nav_view);

    }
    for

    // Getter dIndex. This is coming from DayViewModel

    public int getJ() {
        return j;
    }

    // Getter for  newRecording. This is coming from MediaRecorderViewModel 

    public String getNewRecording() {
        return newRecording;
    }
}

1 Ответ

0 голосов
/ 17 июня 2020

Я решил. Мне нужно было создать экземпляр MediaRecorderViewModel в методе onViewCreated () фрагмента. Кроме того, владельца пришлось сменить с this на getActivity () .

Вот код во фрагменте:


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated (view, savedInstanceState);
        mediaRecorderViewModel = new ViewModelProvider (getActivity ())
        .get (MediaRecorderViewModel.class);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...