【问题标题】:life cycle callbacks of fragments are not called accordingly片段的生命周期回调没有被相应地调用
【发布时间】:2016-02-08 14:30:04
【问题描述】:

我有一个带有视图寻呼机和三个操作选项卡“片段”的主要活动。我为每个主要活动和 三个片段。并且在每个生命周期回调中,我放置了一个日志语句,指示调用哪个生命周期回调以了解如何 带有视图寻呼机的操作栏的行为。在运行时,我发现了一种奇怪的行为,我无法理解或将其归因于任何原因。

第一次行为

when the App fisrt starts I receive:

02-08 15:16:14.771 32243-32243/com.example.com.vpager_00 W/MainActivity: onCreate()
02-08 15:16:14.901 32243-32243/com.example.com.vpager_00 W/MainActivity: onStart()
02-08 15:16:14.901 32243-32243/com.example.com.vpager_00 W/MainActivity: onResume()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_1: onAttach()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_1: onCreate()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_1: onCreateView()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_1: onStart()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_1: onResume()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_2: onAttach()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_2: onCreate()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_2: onCreateView()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_2: onStart()
02-08 15:16:14.941 32243-32243/com.example.com.vpager_00 W/Frag_2: onResume()

我找不到任何理由为什么只调用 mainactivty、frag_1 和 frag_2 的生命周期回调而不是 frag_3?有什么解释吗?

第二种行为

occured when i touched tab3 "frag_3", i received:

02-08 15:16:36.031 32243-32243/com.example.com.vpager_00 D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
02-08 15:16:36.121 32243-32243/com.example.com.vpager_00 W/Frag_3: onAttach()
02-08 15:16:36.121 32243-32243/com.example.com.vpager_00 W/Frag_3: onCreate()
02-08 15:16:36.121 32243-32243/com.example.com.vpager_00 W/Frag_3: onCreateView()
02-08 15:16:36.121 32243-32243/com.example.com.vpager_00 W/Frag_3: onStart()
02-08 15:16:36.121 32243-32243/com.example.com.vpager_00 W/Frag_3: onResume()
02-08 15:16:36.461 32243-32243/com.example.com.vpager_00 W/Frag_1: onPause()
02-08 15:16:36.461 32243-32243/com.example.com.vpager_00 W/Frag_1: onStop()
02-08 15:16:36.471 32243-32243/com.example.com.vpager_00 W/Frag_1: onDestroy()

我认为调用生命周期回调是可以理解的,但为什么只有 frag_1 的生命周期回调也被调用,我认为, 除了 frag_3 和 frag_1 的回调之外,还必须调用 frag_2 的回调,因为 frag_2 最近处于 onResume() 状态。

有什么解释吗?

主要活动

public class MainActivity extends AppCompatActivity {

private final String TAG = this.getClass().getSimpleName();

private Toolbar mTB = null;
private TabLayout mTL = null;
private ViewPager mVP = null;
private VPagerAdapter mVPAdapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w(TAG, "onCreate()");

    this.initViews(R.layout.act_main);
    this.initObjs();
}

private void initObjs() {
    this.mVPAdapter = new VPagerAdapter(getSupportFragmentManager(), this.mTL.getTabCount());
    this.mVP.setAdapter(this.mVPAdapter);

    this.mVP.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(this.mTL));
    this.mTL.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            mVP.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

private void initViews(int rootView) {
    setContentView(rootView);

    this.mTB = (Toolbar) findViewById(R.id.toolbar);
    this.mTL = (TabLayout) findViewById(R.id.tab_layout);
    this.mVP = (ViewPager) findViewById(R.id.pager);

    setSupportActionBar(this.mTB);
    this.mTL.addTab(this.mTL.newTab().setText("Tab 1"));
    this.mTL.addTab(this.mTL.newTab().setText("Tab 2"));
    this.mTL.addTab(this.mTL.newTab().setText("Tab 3"));
    this.mTL.setTabGravity(TabLayout.GRAVITY_FILL);
}

@Override
protected void onStart() {
    super.onStart();
    Log.w(TAG, "onStart()");
}

@Override
protected void onResume() {
    super.onResume();
    Log.w(TAG, "onResume()");
}

@Override
protected void onPause() {
    super.onPause();
    Log.w(TAG, "onPause()");
}

@Override
protected void onStop() {
    super.onStop();
    Log.w(TAG, "onStop()");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.w(TAG, "onDestroy()");
}

}

frag_1

public class Frag_1 extends Fragment {

private final String TAG = this.getClass().getSimpleName();

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Log.w(TAG, "onAttach()");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w(TAG, "onCreate()");
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.w(TAG, "onCreateView()");

    return inflater.inflate(R.layout.frag_1, container, false);
}

@Override
public void onStart() {
    super.onStart();
    Log.w(TAG, "onStart()");
}

@Override
public void onResume() {
    super.onResume();
    Log.w(TAG, "onResume()");
}

@Override
public void onPause() {
    super.onPause();
    Log.w(TAG, "onPause()");
}

@Override
public void onStop() {
    super.onStop();
    Log.w(TAG, "onStop()");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.w(TAG, "onDestroy()");
}

}

frag_2

public class Frag_2 extends Fragment {

private final String TAG = this.getClass().getSimpleName();

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Log.w(TAG, "onAttach()");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w(TAG, "onCreate()");
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.w(TAG, "onCreateView()");

    return inflater.inflate(R.layout.frag_2, container, false);
}

@Override
public void onStart() {
    super.onStart();
    Log.w(TAG, "onStart()");
}

@Override
public void onResume() {
    super.onResume();
    Log.w(TAG, "onResume()");
}

@Override
public void onPause() {
    super.onPause();
    Log.w(TAG, "onPause()");
}

@Override
public void onStop() {
    super.onStop();
    Log.w(TAG, "onStop()");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.w(TAG, "onDestroy()");
}

}

frag_3

public class Frag_3 extends Fragment {

private final String TAG = this.getClass().getSimpleName();

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Log.w(TAG, "onAttach()");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w(TAG, "onCreate()");
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.w(TAG, "onCreateView()");

    return inflater.inflate(R.layout.frag_3, container, false);
}

@Override
public void onStart() {
    super.onStart();
    Log.w(TAG, "onStart()");
}

@Override
public void onResume() {
    super.onResume();
    Log.w(TAG, "onResume()");
}

@Override
public void onPause() {
    super.onPause();
    Log.w(TAG, "onPause()");
}

@Override
public void onStop() {
    super.onStop();
    Log.w(TAG, "onStop()");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.w(TAG, "onDestroy()");
}

}

【问题讨论】:

  • 请添加您的代码,我们不知道您如何添加您的Fragments
  • @Amy 代码添加请见上文

标签: android android-fragments android-viewpager android-lifecycle


【解决方案1】:

在 ViewPager 中,片段被提前创建。

这意味着,您的Frag_2 尚不可见(因为Frag_1 覆盖了整个屏幕),但它仍会预先创建视图,因此滚动到Frag_2 会很流畅。

默认情况下,ViewPager 在每一侧预加载一个片段。因此,如果您将 ViewPager 的起始位置设置为Frag_2,它也会加载Frag_1Frag_2,因为它们是邻居。

您会注意到,当您滑动到 Frag_2 时,将创建 Frag_3

您可以通过调用ViewPager.setOffscreenPageLimit(int limit)来增加预加载片段的数量。

请注意,最小。 number 为 1,因此不能禁用。

【讨论】:

  • 好的,我阅读了文档,但据我了解,好像设置了永远不应该重新创建的页数。因为我将它设置为 2 并且我有 3 个片段,而发生的情况是,在运行时,所有片段都已创建,当我在它们之间导航时,它们都没有被重新创建
  • 是的,它们都没有被重新创建。但它们也消耗更多内存,因为所有 3 个片段都保留在那里,而不是仅 2 个。
【解决方案2】:

生命周期回调没问题..

勾选setOffscreenPageLimit方法,你可以使用它来设置在空闲状态下视图层次结构中当前页面任一侧应该保留的页面数量。默认情况下它设置为 1,这就是原因,因为你有这种行为..

【讨论】:

  • 好的,我阅读了文档,但据我了解,它好像设置了永远不应该重新创建的页数。因为我将它设置为 2 并且我有 3 个片段,而发生的情况是,在运行时,所有片段都已创建,当我在它们之间导航时,它们都没有被重新创建
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 2013-03-30
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2017-07-02
  • 2014-10-01
相关资源
最近更新 更多