2017-03-15 103 views
1

我正在用ViewPager和片段創建演練活動,我已經能夠成功創建演練,但問題是,如果嘗試,我只能滑動到前端爲了刷迴應用程序崩潰,我嘗試在另一個測試應用程序上進行復制,該測試應用程序正面和背面都完美地工作,儘管該應用程序在使用ImageView時使用了TextView。java.lang.IllegalStateException:片段已激活

我需要幫助弄清楚爲什麼它在滑回時崩潰。

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; 
     } 

    } 
} 

ContentFragment

public class ContentFragment extends Fragment { 
    private static final String ARG_PARAM1 = "param1"; 

    private int mParam1; 

    public ContentFragment() { 
     // Required empty public constructor 
    } 

    public static ContentFragment newInstance(int param1) { 
     ContentFragment fragment = new ContentFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PARAM1, param1); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getInt(ARG_PARAM1); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.indicator_fragment, container, false);; 
     ImageView imageView = (ImageView) view.findViewById(R.id.imageView); 
     imageView.setImageResource(mParam1); 
     return view; 
    } 

    public int getmParam1() { 
     return mParam1; 
    } 

} 

錯誤日誌

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) 
+0

您能分享您的ContentFragment.newInstance(...)功能嗎? – Cochi

+0

@科奇我已經添加了它 – SimpiMind

回答

0

我相信代碼得罪線

@Override 
    public Fragment getItem(int position) { 
     int index = position % mFrags.size(); 
     return mFrags.get(index); 
    } 

    @Override 
    public int getCount() { 
     return Integer.MAX_VALUE; 
    } 

我不確定你想要實現什麼,但是這段代碼非常糟糕。它使ViewPager相信你有比你實際上更多的碎片,並多次重複使用相同的碎片。假設mFrags.size()爲2並且ViewPager要求#0,#1和#2 - 您將返回片段#0兩次並且ViewPager可能嘗試在生命週期中兩次傳遞相同的片段。片段的重新使用很可能是您看到的例外的來源。

順便說一句,簡單明瞭的問題是什麼?

@Override 
    public Fragment getItem(int position) { 
     return mFrags.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFrags.size(); 
    } 
+0

你是對的,那是罪魁禍首,我使用了直截了當的方式,它的工作,謝謝。 – SimpiMind

相關問題