我想要更好地理解FragmentManager和FragmentTransactions以正確開發我的應用程序。特別是關於它們的生命週期以及提交FragmentTransaction(add)的長期效果。我對這個問題感到困惑的原因是當我運行一個示例活動,在帖子末尾列出。瞭解有關活動的FragmentManager和FragmentTransaction生命週期
我故意創建了一個名爲fragMan的靜態FragmentManager變量,並最初將其設置爲null。然後在onCreate()中檢查它是否爲null,並且在看到null值時,將fragMan變量設置爲getFragmentManager()返回值。在配置更改期間,Log.d顯示碎片不爲空,但之前添加的碎片「CameraFragment」在碎片中未找到,而fragman.isDestroyed()返回true。這對我來說意味着Activity.getFragmentManager()返回一個FragmentManager的新實例,並在fragMan老FragmentManager實例已經摧毀它的數據(?)
這裏就是混亂的用武之地。
1)「CameraFragment」如何在配置更改中的Activity上仍然關聯,並在 中找到FragmentManager的新實例?
2)當我點擊手機上的後退按鈕退出活動時,我使用應用程序菜單重新啓動樣本 活動。 CameraFragment不再可見,並且onCreate()檢查顯示fragMan仍然不爲null。我認爲點擊後退按鈕 稱爲默認的完成()命令,從內存中清除活動,並重新啓動它 將產生與樣本活動的初始啓動相同的結果?
謝謝你提供的任何和所有幫助!
public class MainActivity extends Activity
{
static FragmentManager fragMan = null;
FragmentTransaction fragTransaction;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (fragMan != null)
{
Log.d("log", Boolean.toString(fragMan.isDestroyed()));
if(fragMan.findFragmentByTag("Camera Preview") == null)
{
Log.d("log", "Camera Preview not found.");
}
}
else
{
fragMan = getFragmentManager();
fragTransaction = fragMan.beginTransaction();
Fragment cameraFragment = new CameraFragment();
ViewGroup root_view = (ViewGroup) findViewById(android.R.id.content);
fragTransaction.add(root_view.getId(), cameraFragment, "Camera Preview");
fragTransaction.commit();
}
嘿唐, 感謝回答。我意識到靜態變量與應用程序進程的存在有關,而不是Activity(類)實例本身。關於主屏幕,我明白如果用戶點擊主頁按鈕,活動不會被破壞,但當我按下後退按鈕時,我在日誌中看到了「onStop()」命令。 主要問題是如何靜態fragmentManager(而不是一個CameraFragment實例)不爲空,但仍然返回到isDestroyed(),並找不到以前的CameraFragment混淆。 – blkhatpersian
FragmentManager是一個靜態變量,正如您所指出的那樣,它與應用程序進程綁定在一起 - 這就是爲什麼當您返回到活動時它不爲空。 – don
您編輯的答案與詳細的流程幫助了很多!我正在嘗試將一個片段動態地附加到一個活動中,並且現在知道如何做到最好。顯然,靜態fragmentManager只會浪費內存。謝謝唐 – blkhatpersian