如何检测弹窗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
相关产品推荐
相关产品推荐

