16

私の小さなAndroidアプリケーションでは、ですべて正常に機能していますが、各ページに3ページのViewPagerが3ページあります(earlier question参照)。複数のフラグメントを含む1ページのビューペア「java.lang.IllegalArgumentException:IDのビューが見つかりません」

大きな画面では、ViewPagerのままにしますが、最初の2つのフラグメントを同じ最初のページに配置します。このため

、私は自分のPagerAdapterを実装し、これは主に働いている、私が解決しようとしている唯一の問題は、私は、画面を回転させていたとき、私はエラーを取得する次のとおりです。

12-11 16:34:13.526: ERROR/AndroidRuntime(9221): FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matthieu/com.matthieu.TestActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f030002 (com.matthieu:id/top_fragment) for fragment TestFragment{481a3a98 #0 id=0x7f030002} 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815) 
     at android.app.ActivityThread.access$2400(ActivityThread.java:125) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:123) 
     at android.app.ActivityThread.main(ActivityThread.java:4627) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:521) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f030002 (com.matthieu:id/top_fragment) for fragment TestFragment{481a3a98 #0 id=0x7f030002} 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
     at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1861) 
     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 
     at android.app.Activity.performStart(Activity.java:3781) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636) 
     ... 12 more 

私はサンプルを入れます私がやろうとしていることをシミュレートしているコード(とこのエラーメッセージを表示)はGitHubにあります。

実際のアプリケーションで使用しているフラグメントのため、実際にはstatic newInstanceコンストラクタを使用できませんが、フラグメントは事前に作成され、 'setRetainInstance(true);'セット。

私はフラグメントshould be part of the hierarchyが含まれていますviewGroupのIDを理解し、そして最終的に、私は推測、それは...

である、それはどんな違いをした場合、私は維持するためのサポートライブラリとSherlockActionBarを使用しています古いデバイスとの下位互換性。

これについてどうやったらいいですか?

EDIT:私はonSaveInstanceStateFragmentManagerからフラグメントを削除する場合、私はもう任意のクラッシュを取得しておりませんことを発見しました。すべてのフラグメントは、私は物事の別の方法に移動していても、......

+1

githubにネストされた断片を使用して私の解決策を押した私はあなたの元の問題を解決するためのいくつかのアプローチを概説しましたここに:http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html – CommonsWare

+0

@CommonsWareマーク、あなたの注意のおかげで:)私は実際に前にそのブログ記事を読んだ。私は、ページを水平に分割しているので、2番目のアプローチしか動作しないと思います。私はそのページをもう一度読んでそこからいくつかのアイデアを選ぶことができるかどうかを見ます。 – Matthieu

+0

@CommonsWareは、これらの異なるアプローチはありません。最も近いものは2番目のものですが、ページにフラグメントは含まれていません。単純なウィジェットだけです...私はできる限りすべてを試してアイデアを使い果たしました。誰かが本当に良いアイデアを持っていない限り、私はこれについて別の方法をとらなければならないでしょう。 – Matthieu

答えて

18

すべての権利を私が欲しいものではありません最初から再作成が、私はこれを行うと、何とか後でそれらの断片を回収する必要がある場合があります推測しています、私はマークにより示唆されるように、ネストされたフラグメントの道を行く...

不完全なものを残して好きではありません。コメントに投稿されたリンクは404にありますが、ネストされたフラグメントについてはexample codeが見つかりました。

私が途中で学んだいくつかのこと:

  • ネストされた断片はsetRetainInstance(true)を持つことができない、またはそれが得られます:

    java.lang.IllegalStateExceptionを:あるfragementsを保持することはできません

  • フラグメントを保持するViewPagerのページにFrameLayoutを作成するのは間違いでした。 Androidコード(具体的にはFragmentPagerAdapter)を見ると、Fragmentを追加する場所はcontainer.getId()です。あなたはそのレベルでもっと洗練された何もできないか、それが壊れるように見えます。私の理解から

  • 、(私のよう)の断片がいくつかの情報を保持している場合のロードに時間がかかり、これを処理するさまざまな方法があります:

    • 使用onSaveInstanceState(好ましい方法?)、フラグメントがネストされている場合は不可能です。 (空の)コンストラクタは、フレームワークが必要とするときに呼び出されます。
    • この場合、savedInstanceBundleは常にnullですが、フラグメント(Javaオブジェクトとして)は破棄されず、onAttach/onCreateViewをそのまま通過します。
    • 保存し、必要なものを復元するためにいくつかの他の方法を探す
    • ...

とにかく、私は

+3

"入れ子にされたフラグメントはsetRetainInstance(true)を持つことはできません" – passsy

関連する問題