Fragments 優化切換卡頓 & 遮蔽穿透點選事件
阿新 • • 發佈:2019-01-24
1、用add(R.id.frag, fragment) & hide(fragment) show(fragment)來解決切換的卡頓
當多個Fragment間切換時 會有明顯的卡頓。以下就是
radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { int buttonid = group.getCheckedRadioButtonId(); for(int i=0; i<rbId.length; i++) { if(buttonid == rbId[i]) { Log.d("xjj","fgs["+i+"]: "+frgs[i] ); updatefrag(frgs[i]); break; } }
因為每次切換 用的是 ft.replace(R.id.fram, fragment); 一旦用了replace 是每次都會走oncreateview的 因此當Fragment頁面東西略多的時候會有明顯的卡頓。
解決方法是 用FragmentTrasaction的hide 和 show方法。如下:
rivate void updatefrag (Fragment fragment){FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); if(fragment.isAdded()) { for(Fragment fg: frgs) { if(fg == fragment) ft.show(fg); else ft.hide(fg); } } else ft.add(R.id.frame, fragment).show(fragment);ft.commit();}
至此卡頓問題解決。 有一個缺點, 因為不是每次都oncreateview, 該頁面的動畫第一次放了一次之後就不再播放,後來切換過來就不再播放。當然 可以將動畫寫在其他週期裡。
2、解決由此帶來的點選穿透事件。
因為用的是add, 所以實際上 一個頁面有多個Fragment, 當點選當前最上面的Fragment空白處時,會穿透該Fragment。 也就是說 若其他Fragment此處有響應事件,則此時即會響應。這就比較尷尬了。。
解決方式是 寫一個baseFragment 來遮蔽穿透, 然後其他Fragment繼承之。 如下
public class BaseFragment extends Fragment implements View.OnTouchListener{ @Override public void onViewCreated(View view, Bundle savedInstanceState) { // block ontouch event. in case it would go down through to another fragment below view.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { return true; }
至此卡頓問題比較妥善地得到解決。happy~