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~