我在我的应用程序的 ActionBar 中始终为“刷新”图标设置动画时遇到了一些问题。
我有一个容器 FragmentActivity,它在用户浏览应用程序时交换片段(从片段本身或从 SlidingMenu 选项)。所以当应用程序第一次加载时,我的 FragmentContainer 添加了 FragA。用户可以从 FragA 导航到 FragB,然后将其换入。
在操作栏中,我显示一个静态的“刷新”图标。随着每个片段的加载,我将其替换为动画“微调器”图标。加载完成后,我恢复到原来的刷新图标。
问题是,这个动画只适用于原始片段(FragA,在这种情况下)。当用户导航到 FragB 并选择刷新图标时,会触发刷新,但动画永远不会发生。类似地,如果按下后退按钮返回到 FragA,这将遵循相同的模式,即刷新按钮在按下时不会动画。
注意事项...
- 我在https://github.com/jfeinstein10/SlidingMenu使用 ActionBarSherlock 和 SlidingMenu 实现。所以上面的活动实际上是一个
SlidingFragmentActivity
. - 两个 Fragments 调用
setHasOptionsMenu(true)
- 我已经通过这个进行了调试,并且onCreateOptionsMenu
每个都被正确调用。 - 两个片段的图标都正确显示-当我离开“默认”片段时,动画没有发生。
- 我在使用 SlidingMenu 导航时看到相同的行为 - FragA 加载,动画工作 -> SlidingMenu 用于导航到不同的片段...动画不起作用 -> 返回按钮到 FragA...动画不起作用在这里。
- 我正在使用
FragmentTransaction.remove()
而add()
不是replace()
像我以前遇到过后退按钮问题replace()
- 我正在使用兼容性库,我在这里读到replace
实现有点错误 - 并且不使用它肯定解决了我看到的问题。
下面的代码片段:
我加载原始片段的代码是....
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, new FragA());
ft.addToBackStack(null);
ft.commit();
将 FragB “交换”为 FragA....
public void switchContent(PysoBaseFragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(existingFragment);
ft.add(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.commit();
}
此方法在容器活动中声明并从 FragA 调用,即...
getFragmentContainer().switchContent(new FragB());
旋转图标的代码在新的 Fragment 开始加载时被调用。它就像...
ImageView spinnerActionView = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);
Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotate_animation);
rotation.setRepeatCount(Animation.INFINITE);
spinnerActionView.startAnimation(rotation);
menuItemRefresh = menu.findItem(R.id.menu_refresh);
menuItemRefresh.setActionView(spinnerActionView);
调用时将wheremenu
分配给容器的实例变量onCreateOptionsMenu
。
更新:
我注意到这个领域的另一个奇怪的错误(我很高兴将它作为一个单独的问题添加,但我在这里更新它,希望它能够阐明我原来的问题 - 我相信两者都是由我如何从我的片段配置我的操作栏)。
当我第一次加载片段时,我会显示 1 个静态刷新图标。如果我旋转屏幕...会出现另一个刷新图标...当我将屏幕旋转回来时,会出现第三个刷新图标!
更奇怪的是,单击后退按钮会依次删除每个附加图标,然后最终(第四次单击)返回到前一个屏幕。