2013-02-11 40 views
13

これはスタックをバックアップするために断片を追加するための責任を負うの機能である:私は戻るボタンをクリックするとAndroid - addToBackStack()が動作しません。

public void populateContent(File f) 
{ 

    ContentFragment cf = new ContentFragment(ctx, ac, this); 
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();; 
    cf.updateView(f); 

    transaction.replace(R.id.contentFragment, cf); 

    transaction.addToBackStack(null); 

    transaction.commit(); 

} 

、最後のフラグメントは、(何も起こりません)ロードされません。

何が原因なのでしょうか?

編集:FragmentManagerログ。

http://pastebin.com/mYnVdkLG

私のアプリケーションは、1秒間に2回のビューを保存するのではなく、最初の1及び2番目のビューを保存しているかのように私には思えます。

+0

FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.commit(); 

... – user1969053

+0

これで解決できませんでした。 – Tool

+0

この回答を見てください:http://stackoverflow.com/a/14030872/1484779 – jlopez

答えて

11

私は実際の解決策についてはわかりませんが、私は少しあなたを導くことができ、おそらく問題が何であるか把握することができます。

実際には2つのフラグメントを置き換えていますか?あなたがしない場合、元に戻すトランザクションはありません。あなたの最初のFragmentがXMLから追加されましたか?マネージャーはこの断片を知りませんし、トランザクションを使用して最初のFragmentを追加する必要があるかもしれません。

if (savedInstanceState == null) performFirstTransaction()を確認しないと、最初にFragmentが2回追加されます。

FragmentManagerenableDebugLoggingを使用することをお勧めします。これはマネージャが知っている断片について教えてくれるでしょう。サイドノートとして http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

、あなたのFragmentのカスタムコンストラクタを使用することは推奨されません:

は、この参照してください。なぜなら、あなたのアプリが殺され、OSによって再インスタンス化されると、それは空のコンストラクタを呼び出すからです。

Fragmentを作成するには、ContentFragment.getInstance(<params>)などの静的メソッドを使用する必要があります。

詳細については、http://developer.android.com/reference/android/app/Fragment.htmlの「クラスの概要」を参照してください。

私の回答があなたに少し問題を見つけるのに役立つことを願っています。

+0

私はあなたにFragmentManagerのログを表示できます。 – Tool

+0

また、私は自分のフラグメントのカスタムコンストラクタを持っていません - 私はそれを変更しませんでした。ビューアップデータとして機能するフラグメントにはメソッドがありますが、私は行います。 – Tool

+0

さて、Managerからログリンクを投稿しました。 – Tool

51

フラグメントトランザクションでaddToBackStack()を呼び出すだけでは不十分であると思われますが、Backボタンが押されたときのバックスタックのポップアップを処理する必要があります。予想通り、私は私の活動にこれを追加し、それが働いた:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+3

これは動作しますが、アニメーションを再生しません。編集:popbackstackでアニメーションを再生する場合は、setCustomAnimationを呼び出すときに2つの追加パラメータを追加します。 [ここ](http://stackoverflow.com/questions/25485822/android-pop-fragment-from-backstack-with-animation)を参照してください。 – Nathan

+2

これはうまく動作します。それは私たちが自分で処理しなければならないというのは驚くべきことです。ドキュメンテーションはこれが自動的に起こると言います。 – Ankit

+0

これはいくぶん文書化されていますか? – Defuera

2

私は、追加の交換ではないが、私は閉じれる断片上ではなく、後に、)(追加する前にaddToBackStack(null)を呼び出すなければなりませんでした、開かれたままの断片にはない。私はあなたがaddtobackStack()フラグメントを交換後、最初とはすべきだと思うクラスA(最初に開いた)(クラスAによって開かれた)クラスB

FragmentTransaction ft = fm.beginTransaction(); 
ft.addToBackStack(null); 
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 
+0

addToBackStackフラグメントの追加/置換を実行すると、それが私にとって何をしたのですか? – Clocker

+0

* add()の前にaddToBackStack(null)を呼び出してください。* これはまさに私の問題でした。あなたは私に頭痛のトンを救った。ありがとう! –

関連する問題