代码之家  ›  专栏  ›  技术社区  ›  Bruno Bieri

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

  •  0
  • Bruno Bieri  · 技术社区  · 8 年前

    我有一个带有viewpager的活动,它显示几个片段(动态创建)。

    在碎片上,我观察到了一些区域。到现在为止,一直都还不错。我现在面临的问题是,一旦我在显示带有片段的活动时进行设备旋转,可观察的字段就不在代码中,而是在片段中,这些字段是空的,因此不会被绑定。

    这是我的 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);
    

    有什么问题吗?


    更新

    好的,我换了 活动 这样的代码:

    @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));
      }
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Ioane Sharvadze    8 年前

    onSaveInstanceState onRestoreInstanceState 保存和恢复字段。

    https://stackoverflow.com/a/30011971/4183017

        2
  •  0
  •   Brijesh Joshi    8 年前

    我们可以通过Android架构组件视图模型来实现这一点。

    check this example

    推荐文章