Android 设备旋转时可观察字段中的空值

Android null value in observable Fields at device rotation

我有一个 activity 带有显示多个片段(动态创建)的 viewpager。

在 Fragments 上我有可观察的字段。到目前为止,一切都很好。我现在面临的问题是,一旦我在显示带有片段的 Activity 时进行设备旋转,可观察字段不在代码中但在片段中字段为空,因此不会被绑定。

这是我的 Fragment 代码:

public class MyFragment extends Fragment
{
  private FragmentSwipeBinding _binding;
  public ObservableField<MyViewModel> observableMyViewModel = new ObservableField<MyViewModel>();

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    _binding = DataBindingUtil.inflate(inflater, R.layout.fragment_swipe, container, false);
    _binding.setViewModel(this);
    _binding.executePendingBindings();

    notifyViewModelChanged();

    // Other code using binding
    _binding....

    return _binding.getRoot();
  }


  private void notifyViewModelChanged()
  {
    MyViewModel viewmodel = observableMyViewModel.get();
    if(viewmodel != null)
    {
      viewmodel.update();
      observableMyViewModel.notifyChange();
    }
  }
}

在我的 Activity 中,我创建了这样的新片段

MyFragment myFragment = new MyFragment();
MyViewModel viewmodel = _myViewModels.get(i);
myFragment.observableMyViewModel.set(viewmodel);

有什么问题的提示吗?


更新

好的,我在 Activity 中更改了这样的代码:

@Override
protected void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);

  // other code

  if(savedInstanceState != null)
  {
    //Restore the fragment's instance
    for(int i = 0; i < _myViewModels.size(); i++)
    {
      MyFragment myFragment;
      if(i < getSupportFragmentManager().getFragments().size())
      {
        myFragment = (MyFragment) getSupportFragmentManager().getFragment(savedInstanceState, "FragmentName" + i);
      }
      else
      {
        myFragment = new MyFragment();
        MyViewModel viewmodel = _myViewModels.get(i);
        myFragment.observableMyViewModel .set(viewmodel);
      }
      myPagerAdapter.addFragment(myFragment,_myViewModels.get(i).getDescription());
    }
  }
  else
  {
    for(int i = 0; i < _myViewModels.size(); i++)
    {
      MyFragment myFragment = new MyFragment();
      MyViewModel viewmodel = _myViewModels.get(i);
      myFragment.observableMyViewModel .set(viewmodel);
      myPagerAdapter.addFragment(myFragment, viewmodel.getDescription());
    }
  }
}

@Override
protected void onSaveInstanceState(Bundle outState)
{
  super.onSaveInstanceState(outState);
  //Save the fragment's instance
  for(int i = 0; i < getSupportFragmentManager().getFragments().size(); i++)
  {
    getSupportFragmentManager().putFragment(outState, "FragmentName" + i, getSupportFragmentManager().getFragments().get(i));
  }
}

在更改配置(例如设备旋转)时,您正在丢失字段。 出于这个原因,我们使用 onSaveInstanceState onRestoreInstanceState 保存和恢复字段。

阅读更多信息:

我们可以借助 Android 架构组件视图模型来实现这一点。 正如我在文档中所读到的,ViewModel class 允许数据在屏幕旋转等配置更改后继续存在。

check this example我想这对你有帮助