2016-06-16 12 views
0

私は、setRetainInstance(true)を持つフラグメントを持っていて、最初の起動後にフラグメントを見つけようとしています。2回目のタグでフラグメントを見つけることができません。

private void showHomeFragment() { 
    mHomeFragment = (HomeFragment) getSupportFragmentManager().findFragmentByTag(HomeFragment.class.getSimpleName()); 

    if (mHomeFragment == null) { 
     mHomeFragment = new HomeFragment(); 
    } 

    showFragment(mHomeFragment, false); 
} 

@Override 
public void showFragment(Fragment fragment, boolean addToBackStack) { 

    @SuppressLint("CommitTransaction") FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.main_container, 
        fragment, 
        fragment.getClass().getSimpleName()); 

    if (addToBackStack) { 
     transaction.addToBackStack(fragment.getClass().getSimpleName()); 
    } 

    transaction.commit(); 

    getSupportFragmentManager().executePendingTransactions(); 
} 

私はこのHomeFragmentをHomeFragmentに戻って別のフラグメントに移動し、タグで見つけることができません。問題が何であるか把握するのに助けてくれる人がいますか?

ありがとうございます!

+0

戻るボタンを押すのと同じプログラムである 'getSupportFragmentManager.popBackStack()'を使って 'HomeFragment'に戻ることができます。 –

+0

@krislarsonしかし、フラグメントがインスタンスをtrueに保持しているのであれば、タグで見つけることができないのはなぜですか? –

答えて

1

引数falseaddToBackStack引数を設定していて、バックスタックに置き換え操作をしないでください。したがって、FragmentManagerはそのトランザクションを元に戻す必要がないため、フラグメントへの参照を解放する可能性が高いため、フラグメントをもう保持する理由はありません。私は確かめるためにそれを試してみる必要があるだろうが、私はそれが起こっていることはかなり確信しています。

setRetainInstance(true)はこのロジックとは関係ありません。これは、フラグメントが破棄されてから構成が変更されるのを防ぐためです。 HomeFragmentを交換して、それがバックスタックにない場合は、FragmentManagerにそのフラグメントを保存する必要はありません。

関連する問題