在AndroidStudio中使用两个ViewModels从Fragments中获取不同类型的数据。

问题描述 投票:0回答:1

我是个新手,需要一些帮助。我正试图让 LiveData 从不同的片段,用两个 ViewModels.

  1. DayViewModel 运作良好。它收集 CharSequence 来自 DayFragment 然后将其传递给 MainActivity 从哪里可以得到数据,用于不同的零碎。
  2. MediaRecorderViewModel 使用同样的方法。

日志显示,MediaRecorderViewModel收集的是 CharSequence 从不同的碎片中正确地接收到了相同的信息,但却没有被接收到。MainActivity! 我做错了什么?这... ViewModelsMainActivity 代码附加在下面。

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;
    }
}
java android-fragments android-activity fragment viewmodel
1个回答
0
投票

我解决了这个问题。我需要在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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.