【问题标题】:How to send data between activities using ViewModel如何使用 ViewModel 在活动之间发送数据
【发布时间】:2019-03-08 04:48:39
【问题描述】:

我使用相同的流程在片段之间发送数据并且它可以工作,但现在我没有在 Receiver Activity 中获取数据。当我点击提交按钮时,即使是日志消息标签也没有显示。我检查了发送方活动日志消息,它正在显示数据,但无法在接收方活动中获取这些数据。

请帮我获取数据。谢谢!!

ViewModel 类:

public class ViewModelClass extends ViewModel {

private final MutableLiveData message = new MutableLiveData();

public void setMessage(HomeModelClass data){
    message.setValue(data);
}

public MutableLiveData getMessage() {
    return message;
   }
}

发件人活动:

    public class EditHomeData extends AppCompatActivity {

    private ViewModelClass viewModelClass;

    HomeModelClass homeModelClassData = new HomeModelClass();

    @Override
    protected void onCreate(Bundle savedInsatancestate) {
    super.onCreate(savedInsatancestate);
    setContentView(R.layout.first_page);

    viewModelClass = ViewModelProviders.of(this).get(ViewModelClass.class);

    setValues();

  });

    public void setValues() {

    if (yes.isChecked()) {
        rent_value = String.valueOf(1);
    } else if (no.isChecked()) {
        rent_value = String.valueOf(0);
    }

    homeModelClassData.setWard_id(ward_id + "");
    homeModelClassData.setToleName(tole_name.getText().toString());
    homeModelClassData.setHouseAge(house_age.getText().toString());
    homeModelClassData.setRadio(rent_value);
    homeModelClassData.setTotal_tenant(editText1.getText().toString());
    homeModelClassData.setMale_tenant(editText2.getText().toString());
    homeModelClassData.setFemale_tenant(editText3.getText().toString());
    homeModelClassData.setHouse_stroyes(spi1);
    homeModelClassData.setRoof_types(spi2);
    homeModelClassData.setLatitude(lati.getText().toString());
    homeModelClassData.setLongitude(longi.getText().toString());

    viewModelClass.setMessage(homeModelClassData);
}

接收者活动:

public class EditHomeData3 extends AppCompatActivity {

Button submit, cancel;

String ward_id, houseNumber, toleName, house_age, radio, total_tenant, male_tenant, female_tenant, house_stroyes,
        roof_types, latitude, longitude, value_updateby;

@Override
protected void onCreate(Bundle savedInsatancestate) {
    super.onCreate(savedInsatancestate);
    setContentView(R.layout.third_page);

    submit = findViewById(R.id.submit_btn);

    submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            getDatafromField();
        }
    });

    private void getDatafromField() {

    final ViewModelClass model = ViewModelProviders.of(this).get(ViewModelClass.class);

    model.getMessage().observe(this, new Observer() {
        @Override
        public void onChanged(@Nullable Object o) {

            if (o instanceof HomeModelClass) {

                HomeModelClass homedata = (HomeModelClass) o;

                ward_id = homedata.getWard_id();
                houseNumber = homedata.getHouseNumber();
                toleName = homedata.getToleName();
                house_age = homedata.getHouseAge();
                radio = homedata.getRadio();
                total_tenant = homedata.getTotal_tenant();
                male_tenant = homedata.getMale_tenant();
                female_tenant = homedata.getFemale_tenant();
                house_stroyes = homedata.getHouse_stroyes();
                roof_types = homedata.getRoof_types();
                latitude = homedata.getLatitude();
                longitude = homedata.getLongitude();
                value_updateby = String.valueOf("1");

                Log.i("GetMessage", houseNumber +"");
            }
        }
    });
}

【问题讨论】:

  • 简单的答案是你不能。为什么是因为活动之间不能共享ViewModel 实例,即使你这样做,它也违反了它的生命周期保留策略。一种解决方法是使用ViewModelFactory 通过将其设为静态来共享您的ViewModels。另一种解决方案是使用意图共享数据。
  • 希望我可以使用 Intent 来传递值,但在我的情况下,我必须从三个活动中获取值,最后在第四个活动中提交这些值。 Intent 可以帮助我解决我的问题,但由于字段很多,因此很难处理这些数据。其实我也是编程新手,所以你能帮我使用 ViewModelFactory 吗?请将 ViewModelFactory 的有效链接发给我,以便在活动之间发送数据。
  • “但在我的情况下,我必须从三个活动中获取值,最后在第四个活动中提交这些值”——如果它们紧密耦合,也许它们不应该是单独的活动。 “请将 ViewModelFactory 的有效链接发给我,以便在活动之间发送数据”——这不是 ViewModelFactory 的正确使用。

标签: android android-viewmodel android-mvvm


【解决方案1】:

ViewModel 不会在活动之间共享 - 因为您将不同的对象传递给 ViewModelProviders.of(),所以您将获得不同的 ViewModel 实例。

Single Activity: Why, When, and How talk 中特别提到了这一点,作为在您的应用中首选单一 Activity 架构的原因。

【讨论】:

  • 谢谢#ianhanniballake。我正在尝试使用 ViewModelFactory 在活动之间传递数据。
【解决方案2】:

是的,事实上,ViewModel 不会在活动之间共享,因此您可以为不同的活动创建不同的视图模型,或者您可以使用具有相同视图模型的不同片段。因为在片段中你可以使用SharedViewModel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多