我是个新手,需要一些帮助。我正试图让 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;
}
}
我解决了这个问题。我需要在Fragment的onViewCreated()方法中实例化MediaRecorderViewModel。加上 主人 不得不改从 这个 到 getActivity().
下面是Fragment中的代码。
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated (view, savedInstanceState);
mediaRecorderViewModel = new ViewModelProvider (getActivity ())
.get (MediaRecorderViewModel.class);
}