【发布时间】: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