2016-04-23 12 views
0

フラグメントを正しく使用する方法を学んでいます。 FragmentManager.popBackStack()は現在のフラグメントの下にフラグメントを追加します

  • ロード
  • それは、この順序で互いに交換する必要があり
  • コンプリート

    • B:

      ==> 私は4つの断片を持っていますLoading ==>Bロードに私のフラグメントAを変更 ==>ロード ==>完全

      方法:ロード中に断片Bを変更

      LoadingFragment loadingFragment = new LoadingFragment(); 
      
          Bundle bundle = new Bundle(); 
          bundle.putBoolean("fragmentA", true); 
      
          loadingFragment.setArguments(bundle); 
      
          getFragmentManager().beginTransaction() 
            .replace(R.id.fragment_container, loadingFragment) 
            .addToBackStack(null) 
            .commit(); 
      

      も同様に(引数のみが明らかに変化している)になります

      フラグメントをフラグメントBにロードする方法:

      new Thread(new Runnable() { 
           @Override 
           public void run() { 
            try { 
             Thread.sleep(1000); 
            } catch (InterruptedException e) { 
             e.printStackTrace(); 
            } 
      
            getFragmentManager().beginTransaction() 
              .replace(R.id.fragment_container, new FragmentB()) 
              .commit(); 
      
           } 
          }).start(); 
      

      Thread.sleep(...)はちょうど長い操作です... 今回は.addToBackStack(null)を追加していません。

      今問題:私はgetFragmentManager().popBackStack()メソッドを使用する場合

      、以前の断片(A)は、代わりにそれをreplaceingの私の実際のフラグメント(私のフラグメントコンテナがあるのLinearLayout)の下に追加されます。これによると:https://stackoverflow.com/a/17793959/3279023それは動作するはずですが、そうではありません。

    答えて

    2

    あなたが経験している動作は、私にとっては良さそうです。 popBackStack()は最後にを保存しました操作は、あなたのケースでは:replace A with Loadingです。

    LoadingAに置き換えますが、それは明らかにトランザクションを記録せずに追加したBには影響しません。

    いずれの場合も、addToBackStack()を使用しているため、両方のトランザクションが登録されているので、popBackStack()を2回呼び出すことができます。

    0

    いくつかのフラグメントは、1つのアクティビティ/スクリーンを作ることができます。バックスタックは、バック矢印のようなもので、最後のアクティビティ/画面に戻ります。

    +0

    私はこれを知っていますが、 'addToBackStack()'メソッドはすべてのトランザクションを覚えておいて、 – Lau

    関連する問題