如何在屏幕方向替换后恢复片段

问题描述:

我有两个片段的活动:DogFragment,LegoFragment。在肖像模式下,我显示DogFragment,并在横向模式下显示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,我只是找到了标签,然后再次调用替换?还是有一个标准的方式来做这些事情?

+0

您应该添加在onConfiguration代码改变。 – k0sh

+0

@ k0sh当你说'那个'代码时,你指的是哪个代码? onCreate内的部分?您能否提供一些解释,说明为什么这种改变可以解决问题? – learner

+0

是的,检查方向更改,只需将其添加到onConfiguration更改,因为此方法将始终在方向更改时触发。 – k0sh

试试这个,创建一个类似的功能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(); 
} 
+0

你真棒!检查和+1!这很好:它是有道理的。所以,感谢您提供清晰的代码。 – learner

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); 
    } 
}