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

如何检测弹窗Activity按钮点击并向原Activity回传数据更新ListView?

嘿,这个需求其实Android里有成熟的Activity数据回传方案,我给你分两种情况讲,优先用官方推荐的新API,也给你兼容旧版本的方法:

实现Activity数据回传并更新ListView的完整方案

一、推荐方案:使用registerForActivityResult(AndroidX 官方推荐)

因为旧的startActivityForResult已经被标记为弃用,所以优先用这个更灵活的新API。

1. 原Activity中注册回调并启动弹窗

首先在你的主Activity里,先初始化ListView,然后注册一个用来接收AddCoin返回数据的ActivityResultLauncher:

public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private ArrayAdapter<String> listAdapter;
    private List<String> coinDataList = new ArrayList<>();

    // 注册接收返回数据的Launcher
    private ActivityResultLauncher<Intent> addCoinResultLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                // 检查返回结果是否有效
                if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
                    // 获取从AddCoin传回来的数据
                    String userInput = result.getData().getStringExtra("COIN_DATA");
                    // 非空判断,避免添加空内容
                    if (!TextUtils.isEmpty(userInput)) {
                        coinDataList.add(userInput);
                        // 通知Adapter更新ListView
                        listAdapter.notifyDataSetChanged();
                    }
                }
            }
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化ListView和Adapter
        listView = findViewById(R.id.coin_list_view);
        listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, coinDataList);
        listView.setAdapter(listAdapter);

        // 打开弹窗Activity的按钮点击事件
        Button openAddCoinBtn = findViewById(R.id.btn_open_add_coin);
        openAddCoinBtn.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, AddCoin.class);
            addCoinResultLauncher.launch(intent);
        });
    }
}

2. 完善AddCoin的按钮点击逻辑

你给出的AddCoin代码不完整,我帮你补全输入框和确认按钮的逻辑,点击按钮时把数据回传给主Activity:

public class AddCoin extends Activity {
    private EditText inputCoinEt;
    private Button confirmBtn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_coin); // 对应你的弹窗布局,包含输入框和按钮

        inputCoinEt = findViewById(R.id.et_coin_input);
        confirmBtn = findViewById(R.id.btn_confirm);

        confirmBtn.setOnClickListener(v -> {
            // 获取用户输入的内容
            String inputContent = inputCoinEt.getText().toString().trim();
            // 封装数据到Intent
            Intent resultIntent = new Intent();
            resultIntent.putExtra("COIN_DATA", inputContent);
            // 设置返回结果为成功,并传递数据
            setResult(Activity.RESULT_OK, resultIntent);
            // 关闭当前弹窗Activity
            finish();
        });
    }
}

二、兼容旧版本:使用startActivityForResult(已弃用,但仍可运行)

如果你的项目还没迁移到AndroidX,可以用这个旧方法:

1. 主Activity中启动并接收结果

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_ADD_COIN = 1001;
    private ListView listView;
    private ArrayAdapter<String> listAdapter;
    private List<String> coinDataList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化ListView
        listView = findViewById(R.id.coin_list_view);
        listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, coinDataList);
        listView.setAdapter(listAdapter);

        // 打开弹窗的按钮点击
        Button openBtn = findViewById(R.id.btn_open_add_coin);
        openBtn.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, AddCoin.class);
            startActivityForResult(intent, REQUEST_ADD_COIN);
        });
    }

    // 重写方法接收返回数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ADD_COIN && resultCode == Activity.RESULT_OK && data != null) {
            String userInput = data.getStringExtra("COIN_DATA");
            if (!TextUtils.isEmpty(userInput)) {
                coinDataList.add(userInput);
                listAdapter.notifyDataSetChanged();
            }
        }
    }
}

2. AddCoin的按钮逻辑和上面完全一致

还是用setResult(Activity.RESULT_OK, resultIntent) + finish()的方式返回数据。

几个关键细节

  • 如果你想让AddCoin看起来是弹窗而不是全屏Activity,记得在AndroidManifest.xml里给它设置Dialog主题:
<activity android:name=".AddCoin"
    android:theme="@style/Theme.AppCompat.Light.Dialog" />
  • 一定要做非空判断,避免把空字符串添加到ListView里,影响体验。
  • 确保AddCoin已经在AndroidManifest.xml中注册,不然会启动失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:48:52