Android - 从Fragments动画ActionBar图标的问题

Nei*_*eil 10 android android-fragments actionbarsherlock android-support-library slidingmenu

我在应用程序的ActionBar中一直设置动画"刷新"图标时遇到一些问题.

我有一个容器FragmentActivity,当用户在应用程序中导航时(从片段本身内部或从SlidingMenu选项中)交换片段.因此,当应用程序首次加载时,我的FragmentContainer会添加FragA.从FragA,用户可以导航到FragB,然后交换进来.

在操作栏中,我显示一个静态的"刷新"图标.当每个Fragment加载时,我用动画"spinner"图标替换它.加载完成后,我将恢复为原始刷新图标.

问题是,此动画仅适用于原始片段(在本例中为FragA).当用户导航到FragB并选择刷新图标时,将触发刷新,但动画永远不会发生.类似地,如果按下后退按钮返回到FragA,则现在遵循相同的模式,即按下时刷新按钮不动画.

注意事项......

  1. 我在https://github.com/jfeinstein10/SlidingMenu上使用ActionBarSherlock和SlidingMenu实现.所以上面的活动实际上是一个SlidingFragmentActivity.
  2. 两个片段都调用了setHasOptionsMenu(true)- 我已经通过这个调试了,并且onCreateOptionsMenu每个都正确调用.
  3. 正在为两个片段正确显示图标 - 当我导航'默认'片段时,动画就不会发生.
  4. 我看到使用SlidingMenu导航时的相同行为 - FragA加载,动画工作 - > SlidingMenu用于导航到不同的片段...动画不起作用 - >后退按钮到FragA ...动画不起作用在这里.
  5. 我使用的是FragmentTransaction.remove()add()而不是replace()因为我以前有过后退按钮的问题与replace()-我使用的兼容性lib和我读了这里的replace实现是一个有点马车-并且不使用固定的肯定我所看到的问题.

代码片段如下:

我加载原始片段的代码是....

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, new FragA());
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

为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();
}
Run Code Online (Sandbox Code Playgroud)

此方法在容器活动中声明,并从FragA调用,即...

getFragmentContainer().switchContent(new FragB());
Run Code Online (Sandbox Code Playgroud)

旋转图标的代码在开始加载时从新的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);
Run Code Online (Sandbox Code Playgroud)

menu被分配到容器的实例变量时onCreateOptionsMenu被调用.

更新:

我注意到这个领域还有一个奇怪的错误(我很高兴将此作为一个单独的问题添加,但我在这里更新它希望它能解释我原来的问题 - 我相信两者都是由我如何从我的片段配置我的动作栏).

当我第一次加载片段时,我显示了1个静态刷新图标.如果我旋转屏幕......会出现另一个刷新图标...当我向后旋转屏幕时,会出现第三个刷新图标!

更奇怪的是,单击后退按钮依次删除每个附加图标,最后(在第4次点击时)返回上一个屏幕.

Gre*_*nsy 5

永远不要在某处更改菜单项,除非

onPrepareOtionsMenu(){
}
Run Code Online (Sandbox Code Playgroud)

你应该像这样。

在您的活动中:

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()
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以从你的框架中调用

((YourActivity)getActivity()).setRefreshing(true);
((YourActivity)getActivity()).setRefreshing(false);
Run Code Online (Sandbox Code Playgroud)


meg*_*its 1

如果每次都使用相同的动画对象,则可能需要在尝试再次运行动画之前重置动画。

尝试在对 startAnimation() 的调用上方添加rotation.reset()。