从Intent返回后禁用按钮X秒的Android实现问题
解决Intent返回后禁用按钮X秒的问题
你的代码核心问题是:postDelayed在启动Intent后立刻执行,不管用户是否从CmxScanner页面返回,10秒后按钮就会被重新启用,完全不符合“返回后再禁用X秒”的逻辑。
以下是两种正确的实现方式:
方法一:使用registerForActivityResult(推荐,适配Android 11+)
这是Android官方推荐的新API,替代已弃用的startActivityForResult:
private ActivityResultLauncher<Intent> scannerLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_menu_layout); // 初始化页面返回监听 scannerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 从扫描页面返回后执行 Guarding.setEnabled(false); // X秒后重新启用按钮,这里设为10秒(10000毫秒) Guarding.postDelayed(() -> Guarding.setEnabled(true), 10000); }); Guarding.setOnClickListener(v -> { SharedPref.write(SharedPref.SCANTYPE, "GUARDING"); Intent intent = new Intent(Menu.this, CmxScanner.class); scannerLauncher.launch(intent); }); }
方法二:使用startActivityForResult(兼容旧版本)
如果项目需要适配Android 10及以下,可使用此方法:
private static final int SCANNER_REQUEST_CODE = 1001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_menu_layout); Guarding.setOnClickListener(v -> { SharedPref.write(SharedPref.SCANTYPE, "GUARDING"); Intent intent = new Intent(Menu.this, CmxScanner.class); startActivityForResult(intent, SCANNER_REQUEST_CODE); }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SCANNER_REQUEST_CODE) { // 返回后禁用按钮 Guarding.setEnabled(false); // X秒后恢复启用 Guarding.postDelayed(() -> Guarding.setEnabled(true), 10000); } }
注意事项
- 确保
Guarding按钮初始状态为启用(布局中默认就是启用,无需额外设置)。 postDelayed的时间单位是毫秒,可根据需求替换10000为你需要的X秒对应的数值。- 若需处理扫描页面返回的结果,可在回调中添加
resultCode或data的判断逻辑。
内容的提问来源于stack exchange,提问作者Terence Bruwer
相关产品推荐
相关产品推荐

