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

点击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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:03:52