1. 程式人生 > >Fragments 優化切換卡頓 & 遮蔽穿透點選事件

Fragments 優化切換卡頓 & 遮蔽穿透點選事件

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~