2017-10-14 16 views
5

Một số thông tin: Tôi có một đoạn có chứa một người xem có ba đoạn. Lần đầu tiên khi tôi mở công cụ chế độ xem đoạn này sẽ hoạt động. Lần thứ hai tôi cố gắng mở đoạn này thì nó bị treo với sau stacktraceTôi gặp sự cố trong Chế độ xem của mình khi tôi mở đoạn phụ huynh lần thứ hai

Chú ý: Đây đang xảy ra trên kitkat trên 19 API của nó làm việc tốt

ViewPager mã thiết lập bên trong đoạn mẹ

private void setupViewPager(ViewPager viewPager) { 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     adapter = new ViewPagerAdapter(getChildFragmentManager()); 
    } else { 
     adapter = new ViewPagerAdapter(getFragmentManager()); 
    } 
    adapter.addFrag(fragment1 , "Abc"); 
    adapter.addFrag(fragment2, "Bcd"); 
    adapter.addFrag(fragment3, "Cdf"); 

    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(2); 

    myTabs.setupWithViewPager(viewPager); 
} 

Bộ tiếp hợp người xem của tôi

class ViewPagerAdapter extends android.support.v13.app.FragmentPagerAdapter { 
    private final List<android.app.Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

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

    @Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 


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

    public void addFrag(android.app.Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

Đây là vụ tai nạn stacktrace:

10-14 21:23:47.276 17601-17601/com.d.p E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.d.p, PID: 17601              
java.lang.IllegalStateException: No activity 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1044) 
    at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1853) 
    at android.app.Fragment.performActivityCreated(Fragment.java:1714) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
    at android.app.BackStackRecord.run(BackStackRecord.java:684) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

Bạn có thể kiểm tra [how-to-tạo-động-tab-and-add-khác-chức năng-to-từng-fragment] (https://stackoverflow.com/questions/ 45457599/how-to-tạo-năng động-tab-và-thêm-khác nhau-chức năng-to-each-fragment-in-a/45458706 # 45458706) – KeLiuyue

+0

đó không phải là hữu ích – Ritzor

+0

Bạn có thể thử nó? – KeLiuyue

Trả lời

4

Cuối cùng giải quyết
Đây là lỗi trong mảnh bản địa và cũng hỗ trợ v4.

Khi bạn chọn Phân đoạn khác qua Ngăn điều hướng hoặc thứ khác giống như nó, đoạn có phân đoạn phụ được tách ra. Vì vậy, các fragmentManager (fragmentManager()) của các phân đoạn con này không còn tồn tại nữa. trong khi những mảnh vỡ đó trở lại, nó bị treo.

Vì vậy, về cơ bản chúng tôi sẽ cần phải làm sạch mChildFragmentManager trong onDetach(). Vì vậy, chỉ cần đặt bên dưới mã trong đoạn có các đoạn lồng nhau.

@Override 
public void onDetach() { 
    try { 
     Field childFragmentManager = android.app.Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    super.onDetach(); 
    } 

Source Google issue Tracker

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