我有一个容器FragmentActivity,当用户通过应用程序导航(从片段本身或SlidingMenu选项)导入和切出片段时.所以当应用程序首次加载时,我的FragmentContainer会添加FragA.从FragA,用户可以导航到FragB,然后交换.
在动作栏中,我显示一个静态的“刷新”图标.随着每个片段的加载,我用一个动画“旋转”图标替换.加载完成后,我恢复到原来的刷新图标.
问题是,这个动画只适用于原始片段(FragA,在这种情况下).当用户导航到FragB并选择刷新图标时,触发刷新,但动画永远不会发生.类似地,如果按下返回按钮返回到FragA,则现在遵循相同的模式,即当按下时刷新按钮不动画.
注意事项…
>我在https://github.com/jfeinstein10/SlidingMenu使用ActionBarSherlock和SlidingMenu实现.所以上面的活动实际上是一个SlidingFragmentActivity.
>两个片段都调用setHasOptionsMenu(true) – 我已经通过调试完成了,并且每个都正确地调用了onCreateOptionsMenu.
>这两个片段的图标正确显示 – 当我导航“默认”片段时,动画就不会发生.
>当使用SlidingMenu导航时,我看到相同的行为 – FragA加载,动画作品 – > SlidingMenu用于导航到不同的片段…动画无效 – >返回按钮到FragA …动画也不在这里.
>我使用的是FragmentTransaction.remove()和add()而不是replace(),因为我之前已经使用了replace()的后退按钮问题 – 我正在使用兼容性lib,我在这里阅读,替换实现是有点错误 – 而不是使用它肯定解决了我看到的问题.
下面的代码片段:
我加载原始片段的代码是….
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.content_frame,new FragA()); ft.addToBackStack(null); ft.commit();
为FragA“交换”FragB ….
public void switchContent(PysoBaseFragment fragment) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.remove(existingFragment); ft.add(R.id.content_frame,fragment); ft.addToBackStack(null); ft.commit(); }
getFragmentContainer().switchContent(new FragB());
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);
当调用onCreateOptionsMenu时,将菜单分配给容器的实例变量.
更新:
我注意到这个方面还有一个奇怪的错误(我很乐意将此作为一个单独的问题添加,但是我在这里更新,希望能够揭示我原来的问题 – 我相信都是由我如何从我的片段配置我的动作栏).
当我第一次加载片段时,我显示1个静态刷新图标.如果我旋转屏幕…另一个刷新图标出现…当我旋转屏幕回来,第三个刷新图标出现!
陌生人仍然,点击后退按钮,依次删除每个附加图标,最后(在第四次点击)返回到上一个屏幕.
解决方法
onPrepareOtionsMenu(){ }
你应该这样.
在你的活动中:
boolean mIsRefreshing =false; public boolean onPrepareOptionsMenu(Menu menu) { if(mIsRefreshing){ final MenuItem menuItemRefresh = menu.findItem(R.id.menu_refresh); menuItemRefresh.setActionView(spinnerActionView); } return true; } public void setRefreshing(boolean refreshing){ mIsRefreshing = refreshing; invalidateOptionsMenu(); //supportInvelidateOptionsMenu() }
所以现在你可以从你的荣耀中呼唤
((YourActivity)getActivity()).setRefreshing(true); ((YourActivity)getActivity()).setRefreshing(false);