You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:13:04