如何从onOptionsItemSelected启动带View参数的Activity?
在onOptionsItemSelected中启动带View参数的Activity解决方案
我懂你现在的纠结——你已经写了需要传入View参数的presentActivity方法,但在onOptionsItemSelected这个菜单点击回调里,没办法直接拿到合适的View来传递,对吧?这里给你几个实用的解决思路:
方法一:绑定界面中特定的目标View
如果你的过渡动画是和界面上某个固定控件关联的(比如Toolbar里的搜索图标),那可以直接找到这个View,再传给presentActivity:
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.your_search_menu_id) { // 找到你要做过渡动画的目标View View targetView = findViewById(R.id.your_target_view); if (targetView != null) { presentActivity(targetView); } return true; } return super.onOptionsItemSelected(item); }
这个思路的核心是提前确定过渡动画对应的View,通过findViewById获取实例后直接传入即可。
方法二:基于菜单Item的位置生成虚拟View
如果过渡动画是围绕菜单Item本身展开的,你可以先获取菜单Item的位置信息,然后创建一个虚拟View来模拟它的位置和大小,再传给presentActivity:
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.your_menu_item_id) { // 获取菜单Item的屏幕位置 Rect itemRect = new Rect(); item.getActionView().getGlobalVisibleRect(itemRect); // 创建虚拟View,匹配菜单Item的位置和尺寸 View dummyView = new View(this); dummyView.setX(itemRect.left); dummyView.setY(itemRect.top); dummyView.setWidth(itemRect.width()); dummyView.setHeight(itemRect.height()); // 传递虚拟View给presentActivity presentActivity(dummyView); return true; } return super.onOptionsItemSelected(item); }
方法三:重构presentActivity方法(更推荐)
其实最灵活的方式是修改presentActivity,让它可以直接接收坐标参数,不再依赖View——毕竟菜单点击场景下,我们真正需要的是展开动画的中心点坐标,而不是View本身:
// 重构后的presentActivity方法 public void presentActivity(int revealX, int revealY) { ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this); Intent search = new Intent(this, search_activity.class); search.putExtra(search_activity.EXTRA_CIRCULAR_REVEAL_X, revealX); search.putExtra(search_activity.EXTRA_CIRCULAR_REVEAL_Y, revealY); ActivityCompat.startActivity(this, search, activityOptionsCompat.toBundle()); } // 在onOptionsItemSelected中调用 @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.your_menu_item_id) { Rect itemRect = new Rect(); item.getActionView().getGlobalVisibleRect(itemRect); int revealX = itemRect.centerX(); int revealY = itemRect.centerY(); presentActivity(revealX, revealY); return true; } return super.onOptionsItemSelected(item); }
这样一来,不管是从普通View点击还是菜单点击启动Activity,都能灵活适配。
内容的提问来源于stack exchange,提问作者Alireza Rashidi
相关产品推荐
相关产品推荐

