前言:
有時候Activity里面或者大Fragment里面切換小fragment的時候,會出現卡頓現象,尤其是小fragment裝載數據較多的時候。此時,對fragment切換處理也能優化切換的速度。
常用方法:
replace()
該方法只是在上一個Fragment不再需要時采用的簡便方法show() hide() add()
正確的切換方式是add(),切換時hide(),add()另一個Fragment;再次切換時,只需hide()當前,show()另一個。
****看代碼吧****
//不優化的做法
//每次切換的時候,Fragment都會重新實例化,重新加載一邊數據,這樣非常消耗性能和用戶的數據流量
public void switchFragment(Fragment targetFragment) {
if (targetFragment == null)
return;
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//目標Fragment替換原來的Fragment
transaction.replace(R.id.content, targetFragment);
transaction.commit();
}
//優化的做法
Fragment currentFragment;//這里currentfragment在下面方法可能會報空指針,請自行處理
private void switchFragment(Fragment targetFragment) {
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
if (!targetFragment.isAdded()) {
transaction
.hide(currentFragment)
//add也是一種加載方式,並不是單純的show
.add(R.id.main_fragment, targetFragment)
.commit();
System.out.println("還沒添加呢");
} else {
transaction
.hide(currentFragment)
//show出來
.show(targetFragment)
.commit();
System.out.println("添加了( ⊙o⊙ )哇");
}
currentFragment = targetFragment;
}
****注意事項****
1. 上面的currentFragment在使用時需在方法里加邏輯判斷,避免空指針。具體需要結合個人使用場景。
2. show出來的fragment在獲取焦點時可能出現問題,而add出來的獲取焦點沒問題。也需要自己處理。