我有4个以上的碎片(android.support.v4.app.Fragment
)。
Fragment f1, f2, f3, f4;
int F1 = 1; int F2 = 2; int F3 = 3; int F4 = 4;
protected void onCreate(Bundle savedInstanceState)
{
//...
f1 = new Fragment();
f2 = new Fragment();
f3 = new Fragment();
f4 = new Fragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fl_root, f1)
.add(R.id.fl_root, f2)
.add(R.id.fl_root, f3)
.add(R.id.fl_root, f4)
.commit();
setFragment(F1);
}
public void setFragment(int fragment)
{
switch (fragment)
{
case F1:
if (!f1.isVisible()) {
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
.show(f1)
.hide(f2)
.hide(f3)
.hide(f4)
.commit();
}
break;
case F2:
if (!f2.isVisible()) {
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
.show(f2)
.hide(f1)
.hide(f3)
.hide(f4)
.commit();
}
break;
case F3:
if (!f3.isVisible()) {
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
.show(f3)
.hide(f1)
.hide(f2)
.hide(f4)
.commit();
}
break;
case F4:
if (!f1.isVisible()) {
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0)
.show(f4)
.hide(f1)
.hide(f2)
.hide(f3)
.commit();
}
break;
}
在setFragment
到第一,第二等之后(1-> 2-> 3-> 4)rtol
(从右向左翻译)动画效果正常,而且没关系。
但是在返回之后,使用setFragment
(4-> 3-> 2-> 1),仍然有rtol
个动画,而不是正确的ltor
(从左到右翻译)右)。
我做错了什么,解决方案是什么?
答案 0 :(得分:1)
实际上,我的项目中单个活动中有20多个碎片
我解决了这个动画问题+ OutOfMemory
(因为添加和隐藏了20多个片段)
一点点代码:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (!back)
ft.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
else
ft.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
switch (fragment)
{
case F1:
ft.replace(R.id.fl_root, new F1(), String.valueOf(F1));
break;
//...
}
答案 1 :(得分:0)
setCustomAnimations 方法需要一个用于输入的动画和一个用于退出片段的动画,因此即使您返回,也会输入其中一个片段。
所以你必须看一下你来自的片段并切换动画。
编辑:
也许喜欢这个未经测试的
int lastFragment;
public void setFragment(int fragment)
{
FragmentTransaction ft = getSupportFragmentManager.beginTransaction();
if(fragment > lastFragment) {
ft.setCustomAnimations(R.anim.rtol, R.anim.ltor, 0, 0);
} else {
ft.setCustomAnimations(R.anim.ltor, R.anim.rtol, 0, 0);
}
switch (fragment)
{
case F1:
if (!f1.isVisible()) {
ft
.show(f1)
.hide(f2)
.hide(f3)
.hide(f4)
.commit();
}
break;
case F2:
if (!f2.isVisible()) {
ft
.show(f2)
.hide(f1)
.hide(f3)
.hide(f4)
.commit();
}
break;
case F3:
if (!f3.isVisible()) {
ft
.show(f3)
.hide(f1)
.hide(f2)
.hide(f4)
.commit();
}
break;
case F4:
if (!f1.isVisible()) {
ft
.show(f4)
.hide(f1)
.hide(f2)
.hide(f3)
.commit();
}
break;
lastFragment = fragment;
}