Я новичок в этом и нуждаюсь в помощи. Я пытаюсь получить LiveData
из разных фрагментов, используя два ViewModels
.
DayViewModel
отлично работает. Он собирает CharSequence
ввод из DayFragment
, а затем передает его MainActivity
, откуда я могу получить данные для использования в разных фрагментах. 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;
}
}