【问题标题】:Could not find active fragment with index -1找不到索引为 -1 的活动片段
【发布时间】:2021-02-09 23:41:03
【问题描述】:

活动片段管理器问题当改变方向时:

Caused by: java.lang.IllegalStateException: Could not find active fragment with index -1
                                                                at

android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:3026) 在 android.support.v4.app.Fragment.restoreChildFragmentState(Fragment.java:1446) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1380) 在 android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740) 在 com.motors.mobile.core.v2.DaggerIncludeBaseActivity.onCreate(DaggerIncludeBaseActivity.java:26)

关注我的代码:

@Override
protected void tabletPortraitInit(Bundle savedInstanceState) {
    super.tabletPortraitInit(savedInstanceState);
    openSubFragment();
}

@Override
protected void tableLandscapeInit(Bundle savedInstanceState) {
    super.tableLandscapeInit(savedInstanceState);
    openSubFragment();
}

protected void openSubFragment() {
    Bundle bundle = getIntent().getBundleExtra(CAR_DETAIL_KEY);
    fragment = new BuyDetailFragment();
    if (getSupportFragmentManager().findFragmentByTag(BuyDetailFragment.TAG) != null)
        fragment = (BuyDetailFragment) getSupportFragmentManager().findFragmentByTag(BuyDetailFragment.TAG);
    fragment.setArguments(bundle);
    menuClickListener = fragment;
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.flMain, fragment, BuyDetailFragment.TAG)
            .commit();
    // init toolbar items
    View tbView = getLayoutInflater().inflate(R.layout.items_detail_menu_layout, toolbar.findViewById(R.id.container), true);
    phone = tbView.findViewById(R.id.phone);
    message = tbView.findViewById(R.id.message);
    link = tbView.findViewById(R.id.notifications);
    site = tbView.findViewById(R.id.site);
    shortlistView = tbView.findViewById(R.id.wishListMenu);
    phone.setOnClickListener((e) -> menuClickListener.clickPhone());
    message.setOnClickListener((e) -> menuClickListener.clickMessage());
    link.setOnClickListener((e) -> menuClickListener.clickNotifications());
    site.setOnClickListener((e) -> menuClickListener.clickSite());
    shortlistView.setOnClickListener((e) -> menuClickListener.clickShortlist());
    Drawable drawable = ContextCompat.getDrawable(this, R.drawable.vector_heart);
    drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.SRC_IN);
    shortlistView.changeIcon(drawable);
}

        There is no my baseActivity

【问题讨论】:

  • 请添加您的代码

标签: android


【解决方案1】:

你的片段有setRetainInstance(true)吗?如果是这样,这可能会导致您出现问题,特别是如果您使用 FragmentStatePagerAdapter 的片段。

【讨论】:

    【解决方案2】:

    dismissAllowingStateLoss 在onSaveInstanceState 和retainInstanceState 之后的组合可能会发生这种情况。

    查看helpful example with steps to reproduce(该网站不允许评论,但它帮助我诊断问题)

    重现步骤:

    1. 使用 retainInstance = true 打开页面并显示对话框片段
    2. 后台应用,onSaveInstanceState 被调用
    3. 通过dismissAllowingStateLoss 关闭异步任务中的对话框
    4. 执行配置更改,例如通过更改语言或方向
    5. 打开应用
    6. crash "无法启动活动... java.lang.IllegalStateException: 找不到索引为 -1 的活动片段"

    在幕后发生的事情是FragmentManagerImpl.restoreAllState 现在有一个索引为-1 的活动片段,因为dismissAllowingStateLoss 从后台堆栈中删除了该片段,但是,它仍然是nonConfigFragments 的一部分,因为dismissAllowingStateLoss 的提交部分被忽略了因为它是在 onSaveInstanceState 之后调用的。

    要解决此问题,需要以下之一:

    1. 不在可以通过dismissAllowStateLoss 关闭的对话框上使用retainInstanceState,或者
    2. 状态丢失后不调用dismiss

    并以不同的方式实现所需的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2016-07-01
      • 2021-11-23
      • 2014-01-16
      • 1970-01-01
      相关资源
      最近更新 更多