【问题标题】:Start fragment from onCreate() when Back Pressed后按时从 onCreate() 开始片段
【发布时间】:2021-09-09 16:04:55
【问题描述】:

我有两个片段。 fragment1 的 onCreate() 中有一些代码。 当我在fragment2 并按回时,它会转到fragment1 并从onCreateView() 开始。但我需要运行 onCreate() 中的代码。

活动中:

getSupportFragmentManager().beginTransaction().
                replace(R.id.host_fragment, new Fragment1()).commit();

在片段 1 中,我有导航到片段 2 的按钮:

getParentFragmentManager().beginTransaction().addToBackStack("").
                        replace(R.id.host_fragment,Fragment2).commit();

而且我在活动中没有任何 onBackPressed() 代码。

有片段的Activity,不是 MainActivity。java

谢谢。

【问题讨论】:

  • 只使用 onCreateView() 而不是 onCreate 有什么问题?
  • 如果您希望每次创建视图时都运行代码,为什么您的代码在 onCreate() 而不是 onCreateView()
  • 我把我的非图形初始化放在onCreate().

标签: java android fragment oncreate onbackpressed


【解决方案1】:

我认为,您不必这样做,已经可以了。当您将 fragment1 放入 backstack 然后按回时,仅当先前实例化的 fragment1 实例在内存中时,才会调用 fragment1 的onCreateView()。如果不在内存中,则相应地调用所有片段生命周期回调,包括onCreate()

所以,如果您在onCreate() 中进行非图形初始化,当您按下返回时,它们已经初始化;或者如果它被创建为新的,至少会被初始化。所有这些都将由片段管理器管理。

【讨论】:

    【解决方案2】:

    你有什么理由把你的代码放在OnCreate() 里吗? 如果不是,则将您的代码放入OnCreateView()‍‍‍‍‍‍‍,因为OnCreateView()OnCreate() 之后被调用。因此,如果您想在片段创建时调用该代码,则可以保证调用您的代码。 此外,如果您查看片段生命周期,您可以看到如果从后台堆栈返回片段,则将调用其OnCreateView() 方法。因此,当您从第二个片段返回时,您的代码将运行。

    【讨论】:

      【解决方案3】:

      简单的工作流程是将每次需要执行的代码从onCreate() 方法移动到onResume()

      onResume() 每次用户关注屏幕时都会调用。或者从背景到前景。

      【讨论】:

        【解决方案4】:

        谢谢大家的回答。

        一开始我以为我的问题只是因为onCreate(),但是当我将代码放入onCreateView() 之后,我的问题仍然存在。

        所以,我决定在 Back Pressed 时重新启动片段。所以我想出了这个解决方案:

        在活动中:

        @Override
        public void onBackPressed() {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
                getSupportFragmentManager().beginTransaction().
                        replace(R.id.host_fragment, new Fragment1()).commit();
            } else {
                super.onBackPressed();
            }
        }
        

        这样有效率吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-21
          • 2013-03-06
          相关资源
          最近更新 更多