【问题标题】:Fragment not added (inconsistent crash)未添加片段(不一致的崩溃)
【发布时间】:2017-02-12 20:21:10
【问题描述】:

在我的MainActivity 中,我有:

@Override
protected void onResume() {
    super.onResume();

    checkForCrashes();
    checkForTutorial();
    checkForUpdates();
    setStore();
    setup();
}

setup() 中,我在回调中调用initializeTabs()

protected void setup() {
    final Store s = getStore();
    setBackground();

    if (s == null) {
        unauthorizedHandler();
        return;
    }
    final Context mainActivity = this;
    fragments = getTabFragments();

    StoresController.getStoreDetails(s, mainActivity, new Callback<StoreDetailDecorator>() {
        @Override
        public void success(StoreDetailDecorator storeDetailDecorator, Response response) {
            s.prettyName = storeDetailDecorator.store.pretty_name;
            s.save();
            Log.v(TAG, s.prettyName);
            TextView toolbar_label = (TextView)findViewById(R.id.toolbar_label);
            toolbar_label.setText(MainActivity.getTruncatedMenuName(s.name()));

            SummaryTab t1 = (SummaryTab)fragments.get(0);
            t1.notifier = (SummaryTabLoadingNotifier)mainActivity;
            initializeTabs(s, fragments);
            t1.populateReport();
        }
    }
}

public void initializeTabs(Store s, List<Fragment> fragments ) {
    ViewPagerAdapter adapter =  new ViewPagerAdapter(getSupportFragmentManager(), getTabTitles(), fragments);
    ViewPager pager = (ViewPager) findViewById(R.id.pager);
    pager.setOffscreenPageLimit(2);
    pager.setAdapter(adapter);
}

最后一行对某些客户来说是崩溃的。

java.lang.IllegalStateException: Fragment InfoTab{1bcb80f} is not currently in the FragmentManager

但不是每次。为什么有时会发生这种情况?与未连接的片段有关吗?我读了一些关于在片段上检查isAdded() 的内容,但那是为了检查片段是否被添加到活动中。我正在使用FragmentStatePagerAdapter

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private CharSequence[] titles;
    private List<Fragment> fragmentList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fragmentManager, CharSequence titles[], List<Fragment> fragmentList) {
        super(fragmentManager);
        this.titles = titles;
        this.fragmentList = fragmentList;
    }

    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public CharSequence getPageTitle(int position) { return titles[position]; }

    @Override
    public int getCount() { return fragmentList.size(); }

    @Override
    public Parcelable saveState() {
        return null;
    }
}

可以saveState(){ return null;} 吗?据我了解,这是为了确保每次都刷新视图。

【问题讨论】:

标签: android android-fragments fragmentpageradapter


【解决方案1】:

onResume() 会在您的活动每次返回前台时调用。

例如,如果您的一位用户按下主页按钮并返回到您的应用程序,则将再次调用getStoreDetails(),并且当结果到达时您将创建一个新适配器(具有相同的旧片段列表)。

您应该实例化您的片段,创建一个适配器并只用适配器填充您的 viewpager 一次(onCreate() 将是现场)。

当新数据从getStoreDetails() 到达时,只需使用新数据更新已添加的片段。

【讨论】:

    【解决方案2】:

    这是因为您在saveState() 中返回null。您不应该尝试覆盖此行为。 但即使你出于某种原因想要这样做,你也必须重写 public void restoreState(Parcelable state, ClassLoader loader) 以避免崩溃,因为该方法依赖于保存在 saveState() 中的数据。

    但我建议您根本不要覆盖它,而是解释您想要在那里实现的目标。

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多