Android PS1模拟器RetroActivity返回键失效及添加返回按钮问题
解决RetroArch游戏Activity返回键失效与添加返回按钮的问题
我来帮你一步步搞定这几个问题:onBackPressed不生效、添加返回按钮,以及确保返回逻辑正常工作。
一、为什么onBackPressed不生效?
看你的代码,核心问题出在RetroActivityCommon的onRetroArchExit方法里:
public void onRetroArchExit() { System.exit(0); }
System.exit(0)会直接终止整个应用进程,这就导致你的onBackPressed还没来得及执行,应用就直接退出了。另外,NativeActivity本身可能会拦截底层输入事件,也会干扰返回键的传递逻辑。
二、修复onBackPressed生效的问题
1. 修改RetroArch的退出逻辑
先把RetroActivityCommon里的强制退出改成正常的Activity销毁:
public class RetroActivityCommon extends RetroActivityLocation { // ... 其他代码保持不变 ... public void onRetroArchExit() { // 替换System.exit(0),改为销毁当前Activity finish(); // 如果需要清除整个任务栈(比如不想回到上一个Activity),可以加这句: // finishAffinity(); } }
2. 正确重写onBackPressed方法
在RetroActivityFuture里,明确重写onBackPressed,自定义返回逻辑:
public final class RetroActivityFuture extends RetroActivityCamera { // ... 其他代码保持不变 ... @Override public void onBackPressed() { // 可选:先处理游戏状态保存逻辑 saveGameProgress(); // 销毁当前Activity,回到上一个页面 finish(); // 不要调用super.onBackPressed(),避免NativeActivity的底层退出逻辑干扰 } // 示例:游戏进度保存方法 private void saveGameProgress() { // 这里写你的游戏状态保存逻辑,比如存档到本地文件 } }
三、添加返回按钮(无布局的两种方案)
因为你的Activity没有布局,我们可以用两种方式添加返回按钮:
方案一:使用ActionBar返回按钮(符合Android规范)
在RetroActivityFuture的onCreate方法里启用ActionBar并设置返回按钮:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启用ActionBar ActionBar actionBar = getActionBar(); if (actionBar != null) { // 显示返回按钮 actionBar.setDisplayHomeAsUpEnabled(true); // 启用返回按钮点击功能 actionBar.setHomeButtonEnabled(true); } } // 处理ActionBar返回按钮的点击事件 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { // 触发自定义返回逻辑 onBackPressed(); return true; } return super.onOptionsItemSelected(item); }
方案二:动态添加悬浮返回按钮
如果不想用ActionBar,可以动态创建一个悬浮按钮添加到窗口:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建返回按钮 Button backBtn = new Button(this); backBtn.setText("返回"); backBtn.setBackgroundColor(Color.parseColor("#80000000")); backBtn.setTextColor(Color.WHITE); backBtn.setPadding(16, 8, 16, 8); // 设置按钮布局参数(悬浮在右下角) WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); params.gravity = Gravity.BOTTOM | Gravity.RIGHT; params.setMargins(0, 0, 20, 20); // 右下内边距 // 添加到窗口 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); windowManager.addView(backBtn, params); // 设置点击事件 backBtn.setOnClickListener(v -> onBackPressed()); }
四、额外注意事项
如果上述修改后返回键还是没反应,可以尝试重写dispatchKeyEvent方法,手动拦截返回键事件:
@Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { onBackPressed(); return true; // 拦截事件,不再向下传递 } return super.dispatchKeyEvent(event); }
这样修改后,用户点击系统返回键或者自定义返回按钮,都会回到上一个Activity,而不是直接退出应用了。
内容的提问来源于stack exchange,提问作者balvin
相关产品推荐
相关产品推荐

