java.lang.IllegalStateException:片段已处于活动状态
我正在使用ViewPager和fragments创建一个演练活动,我已经成功创建了演练,但问题是,我只能向前滑动,如果我尝试向后滑动应用程序崩溃,我尝试在另一个测试应用程序上复制它,该应用程序前后都能正常工作,虽然这一个使用TextView,而这一个使用ImageView 我需要帮助找出为什么它在向后滑动时崩溃java.lang.IllegalStateException:片段已处于活动状态,java,android,android-fragments,android-viewpager,Java,Android,Android Fragments,Android Viewpager,我正在使用ViewPager和fragments创建一个演练活动,我已经成功创建了演练,但问题是,我只能向前滑动,如果我尝试向后滑动应用程序崩溃,我尝试在另一个测试应用程序上复制它,该应用程序前后都能正常工作,虽然这一个使用TextView,而这一个使用ImageView 我需要帮助找出为什么它在向后滑动时崩溃 public class WalkThroughActivity extends AppCompatActivity { ViewPager mPager; Linea
public class WalkThroughActivity extends AppCompatActivity {
ViewPager mPager;
LinearLayout mLinearLayout;
CustomPagerAdapter mAdapter;
MyPageIndicator mIndicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_walk_through);
mPager = (ViewPager) findViewById(R.id.pager);
mLinearLayout = (LinearLayout) findViewById(R.id.pagesContainer);
List < Fragment > fragments = new ArrayList < >();
fragments.add(ContentFragment.newInstance(R.drawable.walkthrough_card_1));
fragments.add(ContentFragment.newInstance(R.drawable.walkthrough_card_2));
fragments.add(ContentFragment.newInstance(R.drawable.walkthrough_card_3));
mAdapter = new CustomPagerAdapter(getSupportFragmentManager(), fragments);
mPager.setAdapter(mAdapter);
mIndicator = new MyPageIndicator(this, mLinearLayout, mPager, R.drawable.indicator_circle);
mIndicator.setPageCount(fragments.size());
mIndicator.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
mIndicator.cleanup();
}
static class CustomPagerAdapter extends FragmentStatePagerAdapter {
List < Fragment > mFrags = new ArrayList < >();
public CustomPagerAdapter(FragmentManager fm, List < Fragment > frags) {
super(fm);
mFrags = frags;
}
@Override
public Fragment getItem(int position) {
int index = position % mFrags.size();
return mFrags.get(index);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
}
错误日志
FATAL EXCEPTION: main
Process: com.simpumind.shoopa, PID: 8207
java.lang.IllegalStateException: Fragment already active
at android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:576)
at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:114)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1216)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:273)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:603)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我相信有冒犯性的代码行是
@覆盖
公共片段getItem(int位置){
int index=位置%mFrags.size();
返回mFrags.get(索引);
}
@凌驾
public int getCount(){
返回Integer.MAX_值;
}
我不确定你想实现什么,但这段代码非常糟糕。它使ViewPager
相信您拥有的片段比实际拥有的要多得多,并多次重复使用同一片段。假设mFrags.size()
为2,而ViewPager
请求#0、#1和#2-您将返回片段#0两次,ViewPager
可能会尝试将同一片段通过生命周期两次。片段的这种重复使用很可能是您看到的异常的根源
顺便问一下,直截了当有什么不对
@覆盖
公共片段getItem(int位置){
返回mFrags.get(位置);
}
@凌驾
public int getCount(){
返回mFrags.size();
}
我认为有问题的代码行是
@覆盖
公共片段getItem(int位置){
int index=位置%mFrags.size();
返回mFrags.get(索引);
}
@凌驾
public int getCount(){
返回Integer.MAX_值;
}
我不确定你想实现什么,但这段代码非常糟糕。它使ViewPager
相信您拥有的片段比实际拥有的要多得多,并多次重复使用同一片段。假设mFrags.size()
为2,而ViewPager
请求#0、#1和#2-您将返回片段#0两次,ViewPager
可能会尝试将同一片段通过生命周期两次。片段的这种重复使用很可能是您看到的异常的根源
顺便问一下,直截了当有什么不对
@覆盖
公共片段getItem(int位置){
返回mFrags.get(位置);
}
@凌驾
public int getCount(){
返回mFrags.size();
}
你能分享你的ContentFragment.newInstance(…)函数吗?@Cochi我添加了它,你能分享你的ContentFragment.newInstance(…)函数吗?@Cochi我添加了它,你是对的,那是罪魁祸首,我使用了直截了当的方法,谢谢。你是对的,那是罪魁祸首,我使用了直截了当的方法,它成功了,谢谢。
FATAL EXCEPTION: main
Process: com.simpumind.shoopa, PID: 8207
java.lang.IllegalStateException: Fragment already active
at android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:576)
at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:114)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1216)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:273)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:603)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)