在AppCompat 7.22工具栏中刷新动画 - setActionView()不更新按钮

时间:2015-04-13 15:52:55

标签: android android-animation android-appcompat android-toolbar

我基本上跟随this answer以设置刷新菜单按钮的动画,唯一的区别是我正在使用AppCompat v7.22而不是ActionBarSherlock。

我的应用中有一个工具栏,定义为(layout / toolbar.xml)

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

我的菜单包含与刷新/同步按钮(menu / menu_list.xml)对应的项目:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    // ...
    <item android:id="@+id/sync"
        android:title="Sincronizar"
        app:showAsAction="always"
        android:icon="@drawable/ic_action_refresh" />
    // ...
</menu>

将动画的视图(layout / iv_sync.xml):

<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/Widget.AppCompat.ActionButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_refresh" />

按下同步按钮后,我将上面的视图设置为项目的动作视图并为其设置动画(ListActivity.java):

private void startSyncAnimation() {
    MenuItem menuItem = myMenu.findItem(R.id.sync);
    ImageView iv = (ImageView) getLayoutInflater().inflate(R.layout.iv_sync, null);
    menuItem.setActionView(iv); // this does nothing to the UI!
    Animation rotate = AnimationUtils.loadAnimation(this, R.anim.rotate);
    rotate.setRepeatCount(Animation.INFINITE);
    iv.startAnimation(rotate);
}

我检查它是否有效时,我不会显示旋转动画代码。问题显然是行menuItem.setActionView(iv),尽管它正在设置动作视图(menuItem.getActionView()将正确返回),但它对UI没有任何作用。

我的目标是API 22,min是API 16.关于可能出现什么问题的任何想法?

1 个答案:

答案 0 :(得分:0)

在初始化动画后,您是否尝试将.setActionView()调用移动到最后?

    MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST);

    Animation animation = new RotateAnimation(0.0f, 360.0f,
            Animation.RELATIVE_TO_SELF, 0.5f,
            Animation.RELATIVE_TO_SELF, 0.5f);
    animation.setDuration(700);
    animation.setRepeatCount(Animation.INFINITE);

    ImageView imageView = new ImageView(this);
    imageView.setImageDrawable(UIHelper.getIcon(this, MMEXIconFont.Icon.mmx_refresh));

    imageView.startAnimation(animation);
    item.setActionView(imageView);