获取ActionBar项目视图以对其进行动画处理

时间:2013-12-28 16:49:29

标签: android android-actionbar android-animation android-view

我的应用程序基本上是一个有购物车的在线商店。启动购物车的按钮位于ActionBar中。当有人按下产品时,它会启动一个动画,产品在屏幕上朝着ActionBar购物车按钮“滑动”。一旦完成购物车“闪烁”。要使购物车闪烁,请使用

ValueAnimator cartAnim = ObjectAnimator.ofFloat(mCartItem, "alpha", 1,
                0.25f, 0);

其中mCartItem是要动画的ActionBar项目视图。

现在事实证明,获取实际ActionBar项目的视图有点难。我可以在onOptionsItemSelected中获取View,但基本上是这样,但是这对我来说不起作用,因为动画不是从ActionBar触发的,而是从主UI中的ListView触发。经过一些谷歌搜索后,我确实找到了一个黑客,这是有效的:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.cartmenu, menu);
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            mCartItem = findViewById(R.id.theitem);
        }
    });
    return(super.onCreateOptionsMenu(menu));
}
  1. 为什么这种方式有效?而不是:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.cartmenu, menu);
        mCartItem = findViewById(R.id.theitem); // Always ends up null.
        return(super.onCreateOptionsMenu(menu));
    }
    
  2. 你怎么解决我的问题?

1 个答案:

答案 0 :(得分:0)

findViewById() 在“this”视图中搜索具有给定id的子视图。当您在onCreateOptionsMenu()中调用它时,菜单仍未附加到主视图,因此您无法找到您的项目。 使用Handler().post(new Runnable()...) findViewById(R.id.theitem)会在创建完所有视图后执行,当然,即使菜单已附加到主视图中,也可以找到它。

更好的解决方案:

由于您在菜单对象中为购物车菜单充气,您可以使用:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.cartmenu, menu);
    mCartItem = menu.findItem(R.id.theitem); //This will find your menu item! :-)
    return(super.onCreateOptionsMenu(menu));
}