17

私の画面をオフにして再びオンにすると、アプリケーションが終了します。ViewPager PagerObserverが登録されていません

Logcatは、このエラーの原因が、私のCourseFragment.classのJava Line 60を指していることを示しています。

mViewPager.setAdapter(infoTechPageAdapter); 

私は、私のCourseFragment.classにViewPagerを実装していますが、これはFragmentを拡張しています。

ここに私のコードだ:

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. 'ViewPager'は' R.layout.activity_drawer_fragment'レイアウトで宣言されていますか?そうであれば、 'getActivity()。findViewById(R.id.pagerYear);'を使用して、代わりにそのフラグメントのビューを直接使用してください: 'getView()。findViewById(R.id.pagerYear); '2。また、' ViewPager'が 'CourseFragment'で使用されるように設定されている場合、' getActivity()。getSupportFragmentManager()の代わりに 'InfoTechPageAdapter'(および残りのアダプター)に' getChildFragmentManager() '。 – Luksprog

+0

私は感動しています。あなたとても良いね!@ _ @別の問題がありますが、解決策が見つからない場合は、後で投稿することになります。どうもありがとうございます。 – Marss

+0

本当に...私はあなたのコメントをどのように見つけたのかわからなかったので、感謝の気持ちを伝える方法はわかりません。答えを記入してください:)彼らはすぐに...私は誰もこの解決策を配置したとは思っていません。 –

答えて

43

としてはコメントで@Luksprogが指摘し、あなたが

getChildFragmentManager() 
ため

getActivity().getSupportFragmentManager() 

を変更する必要があります

理由:getSupportFragmentManager()(およびgetFragmentManager())を使用して、このフラグメントのアクティビティに関連するフラグメント(これはあなたが望むものではありません)と対話します。

getChildFragmentManager()メソッドの説明である、このフラグメント内にフラグメントを配置して管理する(アダプタを使用して)必要なのは何ですか。

ポインタの@Luksprogに大きな感謝、私はあなたと同じ問題を抱えていて、彼は答えを持っていました!本当の答えに自分の答えを投稿するだけです。この問題に対する答えをコメントで見ていると思わない人もいます。

+0

Android 4.0と4.1でgetChildFragmentManager()を持っていないとどうしたらいいですか? –

+1

@ RomulusUrakagiTs'ai:このメソッドは[support library](http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager())からも入手できます。古いAndroidバージョンをサポートする場合は、常に使用してください。 –

+0

多くの人がこれを踏襲していると思われます。['ViewPager'](http://developer.android.com/reference/android/support/v4/view/ViewPager.html)は' super(activity.getFragmentManager )); at ctor ... :( – Diederik

3

100%私は正しいFragmentManagerを使用していたと確信していましたが、この問題が発生していました。私はViewPager's adapterを初期化するときにヌルチェックを行うことでそれを解決しました。

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

スタックトレースを勉強した後、私は問題はフラグメントが実際に見えることはありませんでしたので、ViewPagerが古いアダプタと何か間違って起こっているを解放するときに、古いキャッシュされた断片を破壊しようとしていることだと思い。しかしこれはちょうど推測です。

0

Android Studioで生成されたコードを使用してこの問題が発生し、onStart()を作成する前に、上記の作業をpage.getAdapter() == nullのチェックで使用しました。

決勝コード:私は今持っている

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

唯一の問題は、戻るボタンを押すと、正常に動作するために二回行われる必要があるということです。これがインテントまたはフラグメントの問題であるかどうかわからない...

関連する問題