【问题标题】:OnCreateView in fragment is only called the first time and never againFragment 中的 OnCreateView 仅被第一次调用,不再被调用
【发布时间】:2026-02-22 06:45:01
【问题描述】:

我正在构建一个应用程序,主要使用单个活动和片段来完成我在其中所做的一切。 在我的 MainActivity 上,我处理了一个抽屉菜单的创建,当我点击时,我的项目会转到 Fragments。当我打开应用程序时,它工作正常,我切换到另一个片段并且工作正常,但是当我回到原始片段时,我看到 UI 但没有显示数据。我得出的结论是没有创建显示我的内容的片段,并且调试器没有遇到任何断点,所以我认为我是对的。

MainActivity.java

navigationView.setNavigationItemSelectedListener(
    item -> {
        switch (item.getItemId()) {
            case R.id.nav_home:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, homeFragment).commit();
                navigationView.setCheckedItem(R.id.nav_home);
                break;
            case R.id.nav_user_profile:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, userFragment).commit();
                navigationView.setCheckedItem(R.id.nav_user_profile);
                break;
        }
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
);

HomeFragment.java

homeFragments = new ArrayList<>();
homeFragments.add(newPostFragment("/...", "/..."));
homeFragments.add(newPostFragment("/...", "/..."));

newPostFragment 在哪里

private PostFragment newPostFragment(String /..., String /...) {
    PostFragment fragment = new PostFragment();

    Bundle args = new Bundle();
    args.putString("/...", /...);
    args.putString("/...", /...);
    fragment.setArguments(args);
    return fragment;
}

最后,PostFragment.java

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_posts, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    Log.i("Post", "onViewCreated: Called");
    super.onViewCreated(view, savedInstanceState);
    mToken = InjectorUtils.getInstance().provideTokenRepository(getActivity().getApplication()).getToken();
    /... = getArguments().getInt("/...", 0);
    /... = getArguments().getString("/...", "");
    /... = getArguments().getString("/...", "");
    initRecycleView();
    initializeUI();
}

我看不出这不起作用的原因,因为当我第一次打开应用程序时它没有任何问题。我也在使用 LiveData 并将结果缓存在视图模型中。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 我熟悉的问题,如果你知道请给我回答我的 fab 按钮不隐藏和扩展 fab 按钮不缩小你可以看到我的问题。 *.com/questions/64259818/…
  • 不要使用 .beginTransaction().replace,而不是使用“add”和“addToBackStack”,例如 - getSupportFragmentManager().beginTransaction() .add(R.id.container_between, homeFragment , HomeFragment.TAG) .addToBackStack(HomeFragment.TAG).commit();
  • @SanwalSingh 我使用替换将另一个布局放置在我在activity_main.xml 中设置的 FrameLayout 占位符的位置。你用的是什么.TAG
  • TAG 是 Fragment 中的静态字符串,例如 - public static String TAG = "Home Fragment";
  • 我使用了它,它使我想要的片段保持活力,但我真的不想让用户片段在内存中。既然用户fragment里面有fragment,我需要在user fragment的onDestroy销毁吗? @SanwalSingh

标签: android android-fragments


【解决方案1】:

您正在获取之前创建的片段实例,尝试使用“onResume”来同步视图和模型。

【讨论】:

    【解决方案2】:

    如果你想再次调用 onCreateView() 只需重新附加片段

    getSupportFragmentManager.beginTransaction().detach(fragment).commitNow()
    getSupportFragmentManager.beginTransaction().attach(fragment).commitNow()
    

    【讨论】: