2016-11-04 110 views
1

我有MainActivity的Android片段生命週期和FragmentManager.add()

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

     setContentView(R.layout.activity_main); 

     getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.fragment_container, AFragment.newInstance(75)) 
       .commit(); 
    } 

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

另外,我有AFragment

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

     view.findViewById(R.id.show_b_btn).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       AppCompatActivity appCompatActivity = (AppCompatActivity) getActivity(); 

       appCompatActivity.getSupportFragmentManager() 
         .beginTransaction() 
         .add(R.id.fragment_container, BFragment.newInstance()) 
         .addToBackStack("B") 
         .commit(); 
      } 
     }); 

     return view; 
    } 

BFragment只是一個空片段。

而且我有以下片段生命週期的輸出:

Open the App: 
A - onCreateView 
A - onStart 
A - onResume 

Click R.id.show_b_btn on AFragment: 
B - onStart 
B - onResume 

Click back button: 
B - onPause 
B - onStop 

Close the App: 
A - onPause 
A - onStop 

所以,問題是爲什麼AFragment不調用的onPause當我點擊ShowBFragment爲什麼AFragment不調用的onResume當我點擊後退按鈕?

我認爲這是因爲我使用.add()和BFragment只覆蓋了AFragment,所以當片段可見時,AFragment也「生活」,對嗎?

+0

是的,你是對的。因爲你使用.add()和BFragment只是覆蓋了AFragment,所以AFragment在「BFragment」可見時也「活着」。 –

+0

很酷,謝謝 –

回答

1

只需更換

getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.fragment_container, AFragment.newInstance(75)) 
       .commit(); 

getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.fragment_container, AFragment.newInstance(75)) 
       .commit(); 

這是,如果你的容器上使用FragmentTransaction.add會發生什麼。您添加的片段將放置在您現有片段的頂部。如果你使用FragmentTransaction.replace(R.id.container,片段)它會刪除那些已經在容器中的任何片段,並添加新的一個相同的容器

你也可以參考以下鏈接

Difference between add(), replace(), and addToBackStack()

+0

如果我這樣做,AFragment會調用onResume和onPause。我不需要它。我一直很感興趣,爲什麼在使用.add()時AFragment不會這樣做。 –

+0

這是如果您在容器上使用FragmentTransaction.add會發生什麼情況。您添加的片段將放置在您現有片段的頂部。如果你使用FragmentTransaction.replace(R.id.container,fragment),它會刪除已經在容器中的任何碎片,並將你的新碎片添加到同一個容器 –

+0

明白,謝謝 –