Android 更换屏幕方向后如何恢复碎片

Android 更换屏幕方向后如何恢复碎片,android,android-fragments,screen-orientation,Android,Android Fragments,Screen Orientation,我有一个包含两个片段的活动:DogFragment,LegoFragment。在纵向模式下,我显示狗碎片,在横向模式下,我显示LegoFragment。我的问题是,碎片在旋转后不记得它们的状态。有没有办法保存碎片的状态?了解活动是在方向更改期间重新创建的,并且基于我创建的方向,将DogFragment或LegoFragment附加到活动 这里是活动的onCreate方法,我在其中添加片段 @Override
 protected void onCreate(Bundle savedInstanc

我有一个包含两个片段的活动:DogFragment,LegoFragment。在纵向模式下,我显示狗碎片,在横向模式下,我显示LegoFragment。我的问题是,碎片在旋转后不记得它们的状态。有没有办法保存碎片的状态?了解活动是在方向更改期间重新创建的,并且基于我创建的方向,将DogFragment或LegoFragment附加到活动

这里是活动的
onCreate
方法,我在其中添加片段

@Override

protected void onCreate(Bundle savedInstanceState) {
   
  super.onCreate(savedInstanceState);
    
  setContentView(R.layout.activity_main);

  if (getResources().getConfiguration().orientation == 
     Configuration.ORIENTATION_PORTRAIT) {

   addDogFragment();

  } else {
  
    addLegoFragment();

  }

}

private void addDogFragment() {
  DogFragment fragment = DogFragment.newInstance(null, null);
   
  getSupportFragmentManager().beginTransaction().
  replace(R.id.fragment_container, fragment).commit();

}



private void addLegoFragment() {

  LegoFragment fragment = LegoFragment.newInstance(null, null);
    
  getSupportFragmentManager().beginTransaction().
  replace(R.id.fragment_container, fragment).commit();

}

我知道FragmentManager有我的片段的副本。但我不确定解决这个问题的最佳方法。如果我用一个标记调用
replace
,我是否只需找到dbytag,然后再次调用replace?或者有标准的方法来做这些事情吗?

试试这个,为LegoFragment创建一个类似的函数

private void setDogFragment() {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    Fragment removeFragment = mFragmentManager.findFragmentByTag("lego");
    if (removeFragment!=null) {
        transaction.detach(removeFragment);
    }
    Fragment fragment = mFragmentManager.findFragmentByTag("dog");
    if (fragment != null) {
        transaction.attach(fragment);
    } else {
        fragment = new DogFragment();
        transaction.add(R.id.fragment_container, fragment,
                "dog");
    }
    transaction.commit();
}

您还应该在onConfiguration change中添加该代码。@k0sh当您说
代码时,您指的是哪一个代码?onCreate中的部分?你能解释一下为什么这个改变会解决这个问题吗?是的,方向改变的检查,只需将它添加到onConfiguration change中,因为这个方法总是在方向改变时被触发。你太棒了!!!检查和+1!这很有效:而且很有意义。谢谢你给我一个清晰的密码。
if (getResources().getConfiguration().orientation == 
 Configuration.ORIENTATION_PORTRAIT)
    attachFragment(R.id.fragment_container, "dogFragment",     DogFragment.class.getName());
else 
    attachFragment(R.id.fragment_container, "legoFragment", LegoFragment.class.getName());


private FragmentTransaction mCurTransaction;
private FragmentManager mFragmentManager;
public void attachFragment(int containerViewId, String tag, String fragmentClassName){
    if (mFragmentManager == null)
        mFragmentManager = getSupportFragmentManager(); // or getFragmentManager();

    if (mCurTransaction == null)
        mCurTransaction = mFragmentManager.beginTransaction();

    // Do we already have this fragment?
    Fragment fragment = mFragmentManager.findFragmentByTag(tag);
    if (fragment != null){
        mCurTransaction.attach(fragment);
    }else {
        fragment = Fragment.instantiate(this, fragmentClassName);
        mCurTransaction.add(containerViewId, fragment, tag);
    }
}