假設(shè)場景
用Fragment方法實現(xiàn)一個居中的EditText,在EditText中輸入一些內(nèi)容带兜,要求在屏幕旋轉(zhuǎn)后汁尺,EditText中已經(jīng)輸入的內(nèi)容不會被清空。
1徒河,不要重復(fù)創(chuàng)建Fragment
每次activity被銷毀時系馆,當(dāng)前的fragment狀態(tài)都會被自動保存,所以如果不用以下方法加以判斷顽照,那么每次activity重建都會重復(fù)產(chǎn)生fragment由蘑。
FragmentManager fm= getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.second_fragment_container);
if ( fragment == null ) {
fragment = new SecondFragment();
fm.beginTransaction().add(R.id.second_fragment_container, fragment).commit();
}
2,使用setRetainInstance方法
設(shè)置該方法為true后代兵,可以讓fragment在activity被重建時保持實例不變尼酿。
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
此方法設(shè)置后會讓activity在重建時的fragment生命周期與activity生命周期產(chǎn)生一些差別。差別如下:
- onDestroy將不會被調(diào)用(但onDetach方法會植影,因為fragment將會先從當(dāng)前activity中分離)
- onCreate將因為fragment沒有被重新創(chuàng)建而不會被調(diào)用
- onAttach和onActivityCreated還將會被調(diào)用
3裳擎,保存View為全局變量
有人會發(fā)現(xiàn),為什么設(shè)置了setRetainInstance方法何乎,但是旋轉(zhuǎn)屏幕時句惯,EditText中輸入的內(nèi)容也會被清除呢?這是因為Fragment的onCreateView方法被重新執(zhí)行了支救,重新創(chuàng)建了一個新的View抢野,自然以前輸入的內(nèi)容就沒有了。此時你可以設(shè)置一個全局的View各墨,方法如下:
View view = null;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if ( view == null ) {
Log.e("TestFragment", "view == null");
view = inflater.inflate(R.layout.fragment_second, container, false);
}
return view;
}