2013-05-02 31 views
15

Xin chào, tôi đang gặp phải lỗi này khi sử dụng pageViwer và Bộ điều hợp để trượt qua 3 đoạn.java.lang.IllegalStateException: Không thể thay đổi thẻ của đoạn

đây là pageAdapter tôi

public class FreedomPageAdapter extends FragmentPagerAdapter { 

    private List<Fragment> listFragment; 


    public FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) { 

     super(fm); 
     this.listFragment = listFragment; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
    */ 
    @Override 
    public Fragment getItem(int position) { 
     // TODO Auto-generated method stub 
     return listFragment.get(position); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.view.PagerAdapter#getCount() 
    */ 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return listFragment.size(); 
    } 

ở đây là làm thế nào tôi xác định xem trang

viewPager = (ViewPager) findViewById(R.id.pager); 

     viewPager.setOnPageChangeListener(this); 

     savedListFragment = new SubscribedFragment(); 

     fragmentList.add(savedListFragment); 

     fragmentList.add(savedListFragment); 

     fragmentList.add(savedListFragment); 

     viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(), 
       fragmentList)); 



    private FragmentManager fragmentManager() { 
     return getSupportFragmentManager(); 
    } 

    private FragmentTransaction getFragmentTransaction() { 
     return fragmentManager().beginTransaction(); 
    } 

xem trang nghe

/* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.view.ViewPager.OnPageChangeListener# 
    * onPageScrollStateChanged(int) 
    */ 
    @Override 
    public void onPageScrollStateChanged(int arg0) { 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled 
    * (int, float, int) 
    */ 
    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected 
    * (int) 
    */ 
    @Override 
    public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 

    } 

đối tượng Tuỳ chỉnh đoạn

public class SubscribedFragment extends Fragment{ 

    /* (non-Javadoc) 
    * @see android.app.Fragment#onCreate(android.os.Bundle) 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

    } 

    /* (non-Javadoc) 
    * @see android.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     return inflater.inflate(R.layout.discussion_list_layout, container); 
    } 

} 

Full stack trace của lỗi:

05-02 19:15:44.599: E/AndroidRuntime(19839): FATAL EXCEPTION: main 
05-02 19:15:44.599: E/AndroidRuntime(19839): java.lang.IllegalStateException: Can't change tag of fragment SubscribedFragment{41157420 id=0x7f070005 android:switcher:2131165189:0}: was android:switcher:2131165189:0 now android:switcher:2131165189:1 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:398) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:389) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:99) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:800) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.populate(ViewPager.java:991) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.populate(ViewPager.java:880) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2434) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer.doFrame(Choreographer.java:532) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.os.Handler.handleCallback(Handler.java:725) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.os.Looper.loop(Looper.java:137) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.app.ActivityThread.main(ActivityThread.java:5226) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at java.lang.reflect.Method.invokeNative(Native Method) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at java.lang.reflect.Method.invoke(Method.java:511) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at dalvik.system.NativeStart.main(Native Method) 

Trả lời

62

Đây có thể là bởi vì bạn đang thêm cùng dụ đoạn ba lần vào danh sách. Bạn nên tạo một cá thể mới cho mỗi trang.

Ngoài ra, tôi khuyên bạn nên xem xét FragmentStatePagerAdapter nếu bạn không quá xa để phát triển. Nó có thể là một lựa chọn tốt hơn nếu bạn muốn làm mới nội dung của các đoạn từ hoạt động chính.

+0

Vui lòng xem câu hỏi liên quan của tôi: http://stackoverflow.com/questions/24833912/refresh-fragment-ui-from-fragmentactivity –

+0

@CorneliuDascalu để sử dụng 'FragmentStatePagerAdapter' sẽ giải quyết vấn đề? Có điều gì khác cần thiết như cách người ta phải xử lý 'savedInstanceState'? – ericn

+0

Thật là một lỗi tối nghĩa ... StackOverflow & người dùng tuyệt vời để giải cứu một lần nữa! –

0

Bạn đã tạo một thể hiện của SubscribedFragment() lớp

savedListFragment = new SubscribedFragment(); 

và sau đó bạn đã thông qua danh sách này các đối tượng vào ViewPager adpater:

FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) 

mà nhận Danh sách loại Fragment trong constructor của nó . Kể từ khi các nhà xây dựng nhận Danh sách loại Fragment, cố gắng đúc mỗi savedListFragment vào Fragment trước khi bạn thêm nó vào danh sách và sau đó vượt qua nó để constructor của adpater:

fragmentList.add((Fragment)savedListFragment); 
viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(), fragmentList)); 
5

Các phương pháp sau đây sẽ trả về một đoạn cho mỗi tab:

@Override 
public Fragment getItem(int position) { 
    //Add some code 
    //to verify that it will not return null 
    return listFragment.get(position); 
} 

Mã là tốt, nhưng hãy chắc chắn rằng listFragment chứa ba phân đoạn khác nhau và đoạn không phải là rỗng.

Các vấn đề liên quan