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

Android中如何在Activity间传递Vector Drawable资源引用?

问题分析与解决方案

你的问题核心不是Vector Drawable的特殊处理——它的资源ID就是普通int类型,和PNG图标的R.drawable.xxx没有任何区别,完全可以直接传递。真正的问题出在Intent.FLAG_ACTIVITY_REORDER_TO_FRONT这个标记的行为上:当MainActivity已经存在于任务栈中时,这个标记只会把它调到栈顶,但不会更新它的原始Intent,所以getIntent().getExtras()拿到的始终是MainActivity第一次启动时的Bundle,自然为空。

下面给出两种符合你需求(无需转Bitmap,保持int类型传递)的解决方案:


方案一:使用Activity间返回数据的标准方式(推荐)

用startActivityForResult(旧API)或Activity Result API(AndroidX推荐)来实现图标页面到主页面的数据回传,这是Activity间返回数据的标准流程,逻辑更清晰。

1. 主页面启动图标页面

旧API(适配Android 10及以下)

Intent intent = new Intent(MainActivity.this, IconPage.class);
startActivityForResult(intent, 100); // 100为自定义请求码,只要唯一即可

同时在主页面重写onActivityResult接收数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
        int iconResId = data.getIntExtra("image", 0);
        if (iconResId != 0) {
            iconButton.setImageResource(iconResId);
            tempTask.setIconId(iconResId);
        }
    }
}

新API(AndroidX推荐)

// 在MainActivity的onCreate中注册回调
ActivityResultLauncher<Intent> iconSelectLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == RESULT_OK && result.getData() != null) {
            int iconResId = result.getData().getIntExtra("image", 0);
            if (iconResId != 0) {
                iconButton.setImageResource(iconResId);
                tempTask.setIconId(iconResId);
            }
        }
    }
);

// 启动图标页面时调用
iconSelectLauncher.launch(new Intent(MainActivity.this, IconPage.class));

2. 图标页面返回数据

public void returnToMainActivity(){
    Intent intent = new Intent();
    intent.putExtra("image", R.drawable.icon_trash1_24);
    setResult(RESULT_OK, intent);
    finish(); // 关闭当前页面,回到主页面
}

方案二:保留FLAG_ACTIVITY_REORDER_TO_FRONT的写法

如果你一定要用这种栈调起方式,需要在MainActivity中重写onNewIntent方法来接收新的Intent,并更新当前Activity的Intent引用:

1. 图标页面代码(保留原逻辑)

public void returnToMainActivity(){
    Intent intent = new Intent(IconPage.this, MainActivity.class);
    intent.putExtra("image", R.drawable.icon_trash1_24);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(intent);
}

2. 主页面添加onNewIntent方法

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent); // 将新Intent替换为当前Activity的Intent
    // 处理传递的资源ID
    int iconResId = intent.getIntExtra("image", 0);
    if (iconResId != 0) {
        iconButton.setImageResource(iconResId);
        tempTask.setIconId(iconResId);
    }
}

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:44