点击ActionBar菜单项无法启动Activity,已注册Manifest仍报错
关于FragmentActivity中通过ActionBar菜单项启动Activity的问题
嘿,别担心,这种方式完全是可行的!你遇到的ActivityNotFoundException绝对不是因为FragmentActivity不能启动新Activity,大概率是某个细节配置或者代码写错了,咱们一步步排查:
先排查常见的错误点
1. 检查Manifest中的Activity注册
确保你的新Activity是在<application>标签内部注册的,而且类名、包名没有拼写错误:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.YourApp"> <!-- 主FragmentActivity注册 --> <activity android:name=".MainFragmentActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 要启动的新Activity注册 --> <activity android:name=".YourTargetActivity" android:exported="false" /> <!-- 内部启动时API31+可设为false,外部启动才需要true --> </application>
特别注意:如果你的targetSdkVersion是31(Android 12)及以上,虽然内部显式启动不需要exported,但加上这个属性能避免系统的严格校验问题。
2. 检查启动Intent的代码
在FragmentActivity的onOptionsItemSelected方法里,确保Intent的上下文和目标类是正确的:
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.your_menu_item_id) { // 这里的this就是FragmentActivity的上下文,完全合法 Intent intent = new Intent(this, YourTargetActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); }
别犯低级错误:比如目标Activity的类名拼写错了,或者导入了其他包的同名Activity。
替代方案(更现代的写法)
如果你想换一种符合Android最新规范的写法(毕竟旧的startActivityForResult已被废弃),可以用ActivityResultLauncher:
private ActivityResultLauncher<Intent> targetActivityLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册Activity结果回调 targetActivityLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 处理新Activity返回的结果(如果需要的话) if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); // 执行你的业务逻辑 } } ); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.your_menu_item_id) { Intent intent = new Intent(this, YourTargetActivity.class); targetActivityLauncher.launch(intent); return true; } return super.onOptionsItemSelected(item); }
总结一下:FragmentActivity启动Activity和普通Activity的逻辑完全一致,报错肯定是配置或代码的小疏漏,先仔细排查上面的点,实在不行再试试上面的替代写法。
内容的提问来源于stack exchange,提问作者Isha Jindal
相关产品推荐
相关产品推荐

