2016-09-06 2 views
1

私のMainActivityにはonCreateのアクティビティで置き換えられたFrameLayout(id = fragment_container)があります。FragmentAです。 FragmentAには、ボタン1つだけが含まれており、MainActivityにonClickを呼び出し、FrameLayoutFragmentBに置き換えます。 FragmentBにはRecyclerViewが含まれ、正しく表示されます。私はfragmentManager.popBackStack()に電話してFragmentAに戻します。今度はFragmentAFragmentBの上に表示されます(まだ対話できます)。popBackStackの後でもフラグメントが表示される

popBackStackを呼び出した後にFragmentBが削除されないのはなぜですか?

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    private FragmentManager fragmentManager; 

    @Override 
    public void onBackPressed() { 
     fragmentManager.popBackStack(); 
    } 

    @Override 
    public void onClick(View view) { 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_container, new FragmentB()); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //... 

     fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     FragmentA fragment = FragmentA.getInstance(this); //register OnClickListener 
     fragmentTransaction.replace(R.id.fragment_container, fragment); 
     fragmentTransaction.commit(); 
    } 
//... 
} 

FragmentA

public class FragmentA extends Fragment { 

    private View.OnClickListener onClickListener; 

    public FragmentA() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_a, container, false); 

     FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab); 
     fab.setOnClickListener(onClickListener); 

     return view; 
    } 

    public static FragmentA getInstance(View.OnClickListener onClickListener) { 
     FragmentA fragmentA = new FragmentA(); 
     fragmentA.setOnClickListener(onClickListener); 
     return fragmentA; 
    } 

    private void setOnClickListener(View.OnClickListener onClickListener) { 
     this.onClickListener = onClickListener; 
    } 
} 

FragmentB

public class FragmentB extends Fragment { 

    //... 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.FragmentB, container, true); 
     //manipulating Views... 
     //... 

     return view; 
    } 
} 
+0

フラグメントAに背景色を追加してください。 – JpCrow

+0

@JpCrowはそれほど難しい回避策ではありませんか? –

+0

あなたがあなたの活動のテーマでそれを追加することを好むなら、そのフラグメント – JpCrow

答えて

0

問題が012でありますクラス。引き数attachToRoot=trueを渡すべきではありません。

代わりにこれを試してみてください:

public class FragmentB extends Fragment { 

    //... 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     //don't pass true 
     View view = inflater.inflate(R.layout.FragmentB, container, false); 
     //manipulating Views... 
     //... 

     return view; 
    } 
} 
0

使用popBackStackImmediate代わりに、

popBackStackImmediate docsから
@Override 
public void onBackPressed() { 
    fragmentManager.popBackStackImmediate(); 
} 

popBackStack(のような)が、すぐコールの内部で演算を行い、 。これは後でexecutePendingTransactions()を呼び出すようなものです。

+0

のオーバードローが既に試したことがありますが、何も変更していません。 –

関連する問題