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

Android应用从Activity调用Fragment时每次第二次操作均崩溃求助

问题原因
  • 核心逻辑错误:代码意图和实现逻辑不匹配。你需要实现的是从MainActivity3返回到之前承载fragment_login的主页面,但现有代码是尝试在当前MainActivity3的内部新增fragment_login实例。R.id.container01这个容器id属于之前主页面的布局,MainActivity3对应的activity_main3.xml布局中不存在该id的控件,MainActivity3的FragmentManager只会在自身布局中查找容器,找不到就会抛出该异常。
  • 首次点击看似正常的原因:首次提交Fragment事务时,可能因页面生命周期时序问题暂未触发布局校验,或你误以为点击按钮后的返回是代码生效(实际是误触了系统返回键),第二次触发事务时会严格校验容器存在性,直接触发崩溃。
解决方案

根据业务需求二选一即可:

方案1:仅需返回原有Fragment页面(推荐)

直接关闭当前MainActivity3,系统会自动回到跳转前的主页面(已加载fragment_login的页面),完全不需要操作Fragment。
将MainActivity3按钮点击事件的代码替换为:

finish();

方案2:需要在MainActivity3内部显示fragment_login

先给MainActivity3的布局补充容器,再避免重复添加Fragment:

  1. 修改activity_main3.xml,在合适位置添加Fragment容器:
<FrameLayout
    android:id="@+id/container01"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 优化按钮点击逻辑,避免重复添加Fragment导致异常:
send.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment existFrag = getSupportFragmentManager().findFragmentById(R.id.container01);
        if (existFrag == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container01, new fragment_login())
                    .commit();
        }
    }
});
补充建议

安卓开发官方推荐类名使用大驼峰命名法,建议将fragment_login重命名为LoginFragment,避免后续出现类加载、反射相关的兼容问题。

内容的提问来源于stack exchange,提问作者tomtom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:57:03