我的应用程序基本上是一个有购物车的在线商店。启动购物车的按钮位于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));
}
为什么这种方式有效?而不是:
@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));
}
答案 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));
}