17

Ứng dụng của tôi đóng khi tôi tắt màn hình và bật lại.ViewPager PagerObserver không được đăng ký

Logcat cho tôi biết nguyên nhân gây ra lỗi này đang trỏ đến dòng java 60 trong lớp CourseFragment.class của tôi, mở rộng Phân đoạn.

mViewPager.setAdapter(infoTechPageAdapter); 

Tôi đang triển khai ViewPager trong lớp CourseFragment.class mở rộng Phân đoạn.

Dưới đây là mã của tôi:

public class CourseFragment extends Fragment { 

public static final String ARG_POSITION_NUMBER = "course_number"; 

private int position; 

public CourseFragment() { 
    // Empty constructor required for fragment subclasses 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView; 
    position = getArguments().getInt("position"); 

    String course = getResources().getStringArray(
      R.array.array_navigation_drawer)[position]; 

    getActivity().setTitle(course); 

    rootView = inflater.inflate(R.layout.activity_drawer_fragment, 
      container, false); 

    return rootView; 
}// end onCreateView 

@Override 
public void onStart() { 
    super.onStart(); 

    ViewPager mViewPager = (ViewPager) getActivity().findViewById(
      R.id.pagerYear); 

    Log.i("posit", String.valueOf(position)); 
    switch (position) { 

    case 0: 
     InfoTechPageAdapter infoTechPageAdapter = new InfoTechPageAdapter(
       getActivity().getSupportFragmentManager()); 
     mViewPager.setAdapter(infoTechPageAdapter); 
     break; 

    case 1: 
     ComSciPageAdapter comSciPageAdapter = new ComSciPageAdapter(
       getActivity().getSupportFragmentManager()); 
     mViewPager.setAdapter(comSciPageAdapter); 
     break; 

    case 2: 
     ProfilePageAdapter profilePageAdapter = new ProfilePageAdapter(
       getActivity().getSupportFragmentManager()); 
     mViewPager.setAdapter(profilePageAdapter); 
     break; 
    } 

}// end onStart 
} 

Logcat

09-22 10:54:03.830: E/AndroidRuntime(2917): FATAL EXCEPTION: main 
09-22 10:54:03.830: E/AndroidRuntime(2917): java.lang.IllegalStateException: Observer [email protected] was not registered. 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.database.Observable.unregisterObserver(Observable.java:69) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.view.PagerAdapter.unregisterDataSetObserver(PagerAdapter.java:294) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.usjr.sss.adapter.InfoTechPageAdapter.unregisterDataSetObserver(InfoTechPageAdapter.java:21) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:409) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.usjr.sss.fragment.CourseFragment.onStart(CourseFragment.java:60) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.Fragment.performStart(Fragment.java:1502) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:415) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.usjr.sss.fragment.CourseFragment.onStart(CourseFragment.java:60) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.Fragment.performStart(Fragment.java:1502) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1882) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:573) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.Activity.performStart(Activity.java:5114) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.Activity.performRestart(Activity.java:5169) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread.handleSleeping(ActivityThread.java:3408) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread.access$2700(ActivityThread.java:153) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1426) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.os.Looper.loop(Looper.java:137) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread.main(ActivityThread.java:5227) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at dalvik.system.NativeStart.main(Native Method) 
+7

1. Có phải 'ViewPager' được khai báo trong bố cục' R.layout.activity_drawer_fragment' không? Nếu có, sau đó không sử dụng 'getActivity(). FindViewById (R.id.pagerYear);' để tìm nó, thay vào đó hãy sử dụng trực tiếp khung nhìn của đoạn: 'getView(). FindViewById (R.id.pagerYear); '2. Một lần nữa, nếu' ViewPager' được thiết lập để được sử dụng trong 'CourseFragment' rồi chuyển' getChildFragmentManager() 'cho' InfoTechPageAdapter' (và phần còn lại của bộ điều hợp) thay vì 'getActivity(). GetSupportFragmentManager() '. – Luksprog

+0

Tôi rất ấn tượng. Bạn rất tố[email protected] _ @ Tôi có một vấn đề khác nhưng tôi có lẽ sẽ đăng nó sau này nếu tôi không thể tìm thấy một giải pháp, hy vọng bạn cũng có thể giúp tôi với điều đó. Cảm ơn bạn rất nhiều. – Marss

+0

Thực sự ... Tôi không biết làm thế nào để nói cảm ơn .... bạn thực sự tốt vẫn còn tôi không biết làm thế nào tôi tìm thấy bình luận của bạn ... Xin vui lòng đặt bình luận như là câu trả lời :) để mọi người có thể nhìn thấy họ nhanh chóng ... tôi nghĩ rằng không ai khác đặt giải pháp này .. –

Trả lời

43

Như đã chỉ ra bởi @Luksprog trong một chú thích, bạn cần thay đổi

getActivity().getSupportFragmentManager() 

cho

getChildFragmentManager() 

Lý do: getSupportFragmentManager() (và getFragmentManager()) được sử dụng để tương tác với các đoạn liên quan đến hoạt động của đoạn này, không phải là những gì bạn muốn.

Điều bạn muốn đặt và quản lý Phân đoạn bên trong Phân đoạn này (sử dụng bộ điều hợp của bạn), là mô tả phương pháp getChildFragmentManager().

Một lời cảm ơn lớn cho @Luksprog cho con trỏ; Tôi đã có cùng một vấn đề bạn đã làm, và ông đã có câu trả lời! Chỉ cần đăng câu trả lời của mình trong một câu trả lời thực sự, cho những người khác có thể không nghĩ để tìm trong các ý kiến ​​cho một câu trả lời cho vấn đề này.

+0

Tôi nên làm gì nếu tôi không có getChildFragmentManager() trên Android 4.0 và 4.1? –

+1

@ RomulusUrakagiTs'ai: Phương pháp này cũng có sẵn từ [thư viện hỗ trợ] (http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()), bạn nên luôn sử dụng, nếu bạn định hỗ trợ các phiên bản Android cũ hơn. –

+0

Rất nhiều người có thể bước vào đây như ví dụ ['ViewPager'] (http://developer.android.com/reference/android/support/v4/view/ViewPager.html) chỉ đơn giản là' super (activity.getFragmentManager ()); tại ctor ... :( – Diederik

3

Tôi đã gặp sự cố này mặc dù tôi đã là 100% chắc chắn rằng tôi đã sử dụng đúng FragmentManager. Tôi đã giải quyết nó bằng cách thực hiện kiểm tra rỗng khi khởi tạo ViewPager's adapter.

if(pager.getAdapter() == null) 
    pager.setAdapter(pagerAdapter); 

Sau khi nghiên cứu stacktrace tôi nghĩ vấn đề là ViewPager đang cố gắng phá hủy các mảnh vỡ cache cũ khi phát hành adapter cũ và một cái gì đó đang xảy ra sai vì các mảnh vỡ không bao giờ thực sự nhìn thấy được. Đây chỉ là một đoán mặc dù.

0

Tôi gặp sự cố này khi sử dụng mã do Android Studio tạo và sử dụng công việc ở trên với kiểm tra page.getAdapter() == null trước khi tạo mỗi lần onStart().

mã cuối cùng:

@Override 
public void onStart() { 
    super.onStart(); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    if(mViewPager.getAdapter() == null) { 
     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager()); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 
} 

Chỉ có vấn đề tôi có bây giờ là nhấn nút quay lại cần phải được thực hiện hai lần để hoạt động đúng. Không chắc chắn đây có phải là vấn đề về Intent hoặc Fragment không ...