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~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值