首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android FragmentTransaction.remove() 不生效:缺少 commit() 提交

     編輯:程式設計綜合問答

現象

調用 transaction.remove(fragment) 後,Fragment 視圖仍顯示在界面上。

根本原因

FragmentTransaction 操作必須調用 commit() 或 commitAllowingStateLoss() 才會真正執行。 所有 add/replace/remove/hide/show 只是記錄操作隊列,commit() 才會異步提交給 FragmentManager 執行。

錯誤代碼

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
// 缺少 ft.commit();

正確代碼

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit(); // 或 ft.commitAllowingStateLoss();

進階注意事項

  • commit() 是異步的,若需立即執行可調用 executePendingTransactions()。
  • 在 onSaveInstanceState 後調用 commit() 會拋異常,改用 commitAllowingStateLoss()。
  • 若 Fragment 在返回棧中,remove() 會銷毀視圖但保留實例,配合 popBackStack() 使用。
  • 布局 XML 中靜態聲明的 Fragment (<fragment>) 無法通過 remove() 移除,需動態添加。

完整示例

public void removeFragment(Fragment fragment) {
    if (fragment == null || !fragment.isAdded()) return;
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.remove(fragment);
    ft.commit(); // 關鍵!
    // 可選:強制立即執行
    fm.executePendingTransactions();
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved