【问题标题】:Fragment not in fragmentmanager : Viewpager : onNotifyDataSetChanged : IllegalStateException片段不在片段管理器中:Viewpager:onNotifyDataSetChanged:IllegalStateException
【发布时间】:2015-03-09 17:28:29
【问题描述】:

无论我应用了多少解决方案,我都无法摆脱这个错误。

************ 错误原因 ************ java.lang.IllegalStateException: Fragment b{4210f838} 当前不在 android.support.v4.app.ia(FragmentManager.java:603) 的 FragmentManager 中 android.support.v4.app.ja(FragmentStatePagerAdapter.java:136 ) 在 android.support.v4.view.ViewPager.b(ViewPager.java:874) 在 android.database.DataSetObservable.notifyChanged( DataSetObservable.java:37) at android.support.v4.view.kc(PagerAdapter.java:276) at com.xyz.Activity2$2.a(Activity2.java:351) at com.aad$1.onAnimationEnd(ParallelAnimator.java :73) 在 android.animation.AnimatorSet$AnimatorSetListener.onAnimationEnd(AnimatorSet.java:765) 在 android.animation.AnimatorSet$AnimatorSetListener.onAnimationEnd(AnimatorSet.java:765) 在 android.animation.ValueAnimator.endAnimation(ValueAnimator.java: 1018) 在 android.animation.ValueAnimator.access$400(ValueAnimator.java:51) 在 android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:623) 在一个droid.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:639) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 在 android.view.Choreographer.doCallbacks(Choreographer.java:555) 在 android .view.Choreographer.doFrame(Choreographer.java:524) 在 android.os.Handler.handleCallback(Handler.java:615) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 在 android.os。 Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:4898) 在 java.lang.reflect.Method.invokeNative (Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) at com.android.internal.os .ZygoteInit.main(ZygoteInit.java:773) at dalvik.system.NativeStart.main(Native Method)

我正在使用的代码:

public class PlaceSlidesFragmentAdapter extends FragmentStatePagerAdapter implements IconPagerAdapter {

private List<String> imgList;

Activity activity;

public PlaceSlidesFragmentAdapter(Activity act, FragmentManager fm) {
    super(fm);

    imgList = new ArrayList<String>();
    activity= act;
}

public void addImage(String imgUrl)
{
    imgList.add(imgUrl);
}

public void addAllImages()
{
    for(All Image URLs)
    {
        addImage(s);
    }
}

public void removeAllImages()
{
    imgList.clear();
}

public String getImageName(int pos)
{
    return imgList.get(pos);
}


@Override
public Fragment getItem(int position) {
    return new PlaceSlideFragment(imgList.get(position));
}

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

@Override
public int getIconResId(int index) {
    return 0;
}

@Override
public int getItemPosition(Object object){
    return PagerAdapter.POSITION_NONE;
}

}

我在调用 onNotifyDataSetChanged() 时遇到错误。基本上我在一个活动中有这个viewpager,我在运行时动态添加/删除片段。使用这个:

mAdapter.removeAllImages();
mAdapter.addAllImages();        
mAdapter.notifyDataSetChanged();

崩溃每天发生超过 20 次,每天大约有 500-700 个用户。我还不能在我的系统上重现它。如果您需要任何其他信息,请告诉我。

如果有人可以帮助解决这个问题。这将是一个很大的帮助。 谢谢

编辑:

        // set-up image view-pager
    mAdapter = new PlaceSlidesFragmentAdapter(this, getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

【问题讨论】:

  • 尝试使用getChildFragmentManager() 而不是getFragmentManager() 初始化ViewPager。让我知道这是否有效。
  • getChildFragmentManager() 是 Fragment 上的方法,而不是 FragmentActivity 上的方法。我正在fragmentActivity 下初始化viewpager。我在描述中添加了初始化代码。
  • 这个问题会不会和活动恢复有关?尝试启用“销毁活动”的开发人员选项以重现它。此外,您不应该使用构造函数来实例化您的片段,而是使用静态创建者,就像在此示例中所做的 developer.android.com/reference/android/support/v4/app/…
  • 这可能会有所帮助 >> [FragmentStatePagerAdapter][1] [1]: stackoverflow.com/questions/11296411/…
  • 您好,您可以从调用 notifyDataSetChanged() 方法的位置发布代码吗?我想假设您是在动画结束后调用它的。只需从您调用它的位置发布代码。

标签: android android-fragments android-viewpager


【解决方案1】:

在创建/提交片段时使用

getChildFragmentManager() 

而不是

getFragmentManager()

这应该可以工作,因为适配器层次结构是片段是选项卡管理器的子级。

编辑:

试试这个:

mAdapter = new PlaceSlidesFragmentAdapter(this, getChildFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);

【讨论】:

  • 我不会在任何地方提交片段。一切都由支持库在内部处理。
  • 更新了我的答案。您可能应该使用一个片段来初始化它,这可能会起作用,我至少现在正在这样做。
【解决方案2】:

正如我的评论所述,您的适配器显然与 FragmentManager 不同步。您正在使用 pageradapter 进行动态处理,而在 pageradapter 中进行动态处理的唯一安全方法是通过以下方法:Retrieve a Fragment from a ViewPager

如果你这样实现它,你的适配器内不应该有任何非法状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多