您的位置:首页 > 其它

Fragments 优化切换卡顿 & 屏蔽穿透点击事件

2016-09-21 14:07 841 查看

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~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息