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我想这对你有帮助
我有一个 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我想这对你有帮助