对片段生命周期方法的调用随着每个方向的改变而增加

时间:2014-04-11 12:42:55

标签: android android-fragments

方向从一个片段变为另一个片段。

方向1(风景画面):

  • 片段1的onSaveInstanceState()。
  • 片段2的onSaveInstanceState()。
  • 片段2的onStop()。
  • 片段1的onDestroy()。
  • 片段1的onDetach()。
  • 片段2的onAttach()。
  • 片段2的onCreateView()。
  • 片段2的onStart()。

方向2(纵向回溯):

  • 片段1的onSaveInstanceState()。
  • 片段2的onSaveInstanceState()。
  • onSaveInstanceState() of fragment 1.
  • 片段2的onStop()。
  • 片段1的onDestroy()。
  • 片段1的onDetach()。
  • onDestroy() of fragment 1.
  • onDetach() of fragment 1.
  • 片段2的onAttach()。
  • 片段2的onCreateView()。
  • 片段2的onStart()。

因为当你注意到当我回到片段1时,onSaveInstanceState(), onDestroy() and onDetach()被调用两次以进行第二次方向的连续变化。

就像它随着每个方向的变化而不断增加。

我的活动代码:

我正在添加这样的片段 -

Fragment1 firstFragment = new Fragment1();
Bundle bundle = new Bundle();
firstFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

更新

所以当我点击任何标签时,addToBackStack将标签片段添加到容器中,减少内存并调用重复的生命周期方法。

有效检查片段是否已存在的任何方法然后删除前一个并添加当前片段?

注意:

我试过了 -

  1. if(savedInstanceState == null) { /*Add fragment*/ }

  2. Fragment1 fragment = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.article_fragment); //if (fragment == null) { /*Add fragment*/ }

  3. 这些不是导致其他问题的干净解决方案。

1 个答案:

答案 0 :(得分:1)

您的生命周期的可能原因可能是,没有正确处理Fragment BackStack。这就是它可能多次呼叫的原因。我也遇到了片段问题。但是现在你可以删除将你的Fragment添加到backStack继续。

您的代码将变为:

Fragment1 firstFragment = new Fragment1();
Bundle bundle = new Bundle();
firstFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.commit();

您可以在以下位置找到处理AddingBackStack到Fragment的一些示例:http://www.javacodegeeks.com/2013/06/android-fragment-transaction-fragmentmanager-and-backstack.html

http://www.vogella.com/tutorials/AndroidFragments/article.html

并且为了保留Fragments成员值,您可以使用Android中的SharedPreference来保存值并在加载活动时检索。 http://developer.android.com/reference/android/content/SharedPreferences.html