Нулевое значение Android в наблюдаемых полях при повороте устройства - PullRequest
0 голосов
/ 29 июня 2018

У меня есть активность с виджером, который отображает несколько фрагментов (динамически создаваемых).

На фрагментах у меня наблюдаемые поля. Все идет нормально. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я выполняю ротацию устройства, когда отображается действие с фрагментами, наблюдаемые поля находятся не в коде, а внутри фрагмента, поля равны нулю и, следовательно, не будут связаны.

Вот мой 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));
  }
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Мы можем достичь этого с помощью компонента архитектуры Android ViewModel. Как я читал в документации, класс ViewModel позволяет данным переживать изменения конфигурации, такие как поворот экрана.

проверьте этот пример я думаю, что это поможет вам

0 голосов
/ 29 июня 2018

При изменении конфигурации (например, ротации устройства) вы теряете поля. По этой причине мы используем onSaveInstanceState onRestoreInstanceState сохранить и восстановить поля.

Подробнее на: https://stackoverflow.com/a/30011971/4183017

...