7

ここでは、アプリケーションでタブレットで行うことを希望しています。 Fragment0は決して動かないAndroidフラグメントを別のコンテナに移動するフラグメントのコンテナIDを変更できない

----------------- 
| | | | | 
| | | | | 
|(0)| X | X | X | 
| | | | | 
| | | | | 
----------------- 
becomes 
----------------- 
| | | | | 
| | | | | 
|(0)|(1)| X | X | 
| | | | | 
| | | | | 
----------------- 
and then 
----------------- 
| | | | | 
| | | | | 
|(0)|(2)|(1)| X | 
| | | | | 
| | | | | 
----------------- 
etc... 

が、他のものは右にシフトされています フラグメント(0)は、このような断片(1)...(n)を表示するであろういくつかのメニューがあります。右側の端から出ている断片は破壊されます。

だから私水平のLinearLayoutとセットアップの私のXMLレイアウトを、適切なIDが4でframeLayoutを含む(fragment0 ... fragment3)

私はインスタンス化し、表示fragment0、その後fragment1が、私はシフトすることはできませんよできそれは私が取得、後に右へ:私が見つけただけで、関連する質問がthis onethat oneある

ERROR/AndroidRuntime(343): FATAL EXCEPTION: main 
java.lang.IllegalStateException: Can't change container ID of fragment ... 

、運で提供されるすべてのさまざまなソリューションを試してみました。 .add()続いしようとしましたFragmentTransaction.remove()

は、異なる順序でそれらを試してみましたが、(たとえ誰かが提案し二回としてコミットしようとしている)を介して中間にコミットするために、.replace()を試してみましたaddToBackStack() ...まだ運を呼び出そうとしました。

質問は、このようなフラグメントをFragmentTransactionで移動できるかどうかです。はいの場合、私は間違って何をしていますか(そしてボーナスは、それを生み出すことが可能ですか?)。そうでない場合は、これを実装する適切な方法は何でしょうか?私は断片を毎回(それぞれがいくつかの時間がかかることがウェブ上でいくつかのクエリを実行します)再インスタンス化する必要はありません

注意。これは、1つを再現するための活動に戻って、すべてのデータを抽出することが可能ですが、私はむしろ

答えて

3

...可能であれば、私は、これはあなたが望むかなり何であるかどうかを知りませんことをしないだろうが、私は少しのサンプルを作りましたあなたの問題に関して。基本的には、レイアウトファイルを使用して右シフトを行い、シフトする各フラグメントのラッパーコンテナを使用します。コードサンプルは、少し答えが大きいため、a gist that you can find hereに投稿しました。そのサンプルプレスでListFragmentのアイテム(フラグメント1 - >断片2 - >断片3)のそれぞれは、動作を確認します。断片の

+0

私が探していることはしませんが、あなたのコードを変更しようとしています...私ができる場合は投稿します... – Matthieu

+0

私は必要なものをできました。あなたが作成した要点に自分の変更をどのようにプッシュするのか分からないので、そこに入れます:https://gist.github.com/4166640 – Matthieu

+0

すみません。それは誤植ですか、 'frag_fragaccordion.xml'の' RelativeLayout'ではなく 'LinearLayout'でしょうか? – midnite

20

はい容器はremove()関数を使用して変更することができます。

問題はcommit()です。それは非同期呼び出しであり、メインスレッド上にあるようにスケジュールします。だから、FragmentManagerがこれを他のコンテナに追加する直前に強制的に実行するようにしてください。

このためにはexecutePendingTransactions()の機能を使用する必要があります。これを呼び出した後、フラグメントを新しいコンテナに追加してみてください。

ドキュメント:executePendingTransactions()

コードサンプル:

FragmentManager fManager = getSupportFragmentManager(); 
FragGroups fragGroups = (FragGroups) fManager.findFragmentByTag("groups"); 
if (fragGroups != null) { 
    fManager.beginTransaction().remove(fragGroups).commit(); 
    fManager.executePendingTransactions(); 
} else { 
    fragGroups = new FragGroups(); 
} 
if (mTwoPane) { 
    fManager.beginTransaction().replace(R.id.fragment_container_groups, fragGroups, "groups").commit(); 
} else { 
    fManager.beginTransaction().replace(R.id.fragment_container, fragGroups, "groups").commit(); 
} 

をお楽しみください。フィードバックは、私はここでのポイントを追加したいと思います

編集

を歓迎しています。私は同じ問題を抱えていたので、このスレッドに遭遇し、示唆された変更を適用しました。問題は依然として続きました。次に、私はこの問題を解決したこのスレッドの最後のコメントを調べました。トランザクションをコミットしているときにaddToBackStack()メソッドを削除するか、意図的に使用している場合は別のコンテナに追加する前にスタックを削除してください。将来の読者に役立つことを願っています。

+1

優れた答え!元の質問が探しているものと正確に一致しないかもしれませんが、私はそれが非常に有用であることを発見しました。 –

+2

パヴァン.....私はあなたも知りません...あなたは私のことを知りません....しかし、私はあなたに深刻な愛を持っています、私の友人。 – dell116

+0

@TomR私はそれが役に立つとうれしかった:) –