【问题标题】:How to kill Fragment?如何杀死碎片?
【发布时间】:2016-05-22 15:20:45
【问题描述】:

好吧,我认为它应该很简单

fragmentManager.beginTransaction().replace(R.id.container, otherFragment).commit();

应该这样做,但事实并非如此。

即使fragmentManager.beginTransaction().remove(fragment); 也不会杀死它。

其他片段加载,但在我试图杀死的片段中,有一个 SensorEventListener 即使在片段被替换后也会继续做出反应。我能听到声音和东西。

当然,我可以制作一个布尔值并切换它,但在我看来应该有另一种方法来简单地销毁这个对象。

这就是我初始化片段的方式:

  public static BaseGameFragment newInstance(int mode) {
      BaseGameFragment.mode = mode;
      BaseGameFragment fragment = new BaseGameFragment();   
        return fragment;
  }

我也尝试调用onDestroy();,但它不会停止传感器的反应,因此也不会停止片段内的所有其他进程。

【问题讨论】:

  • 请显示minimal reproducible example,尤其是SensorEventListener
  • 不确定是否可以,尝试在Activity 中调用一个方法,在onDetach 中对Fragment 进行清理。
  • @jaibatrik 但我该如何进行清理?我的意思是,我可以手动使 sensorListener = null 和其他人,但我仍然会在内存中有片段。我认为它在更换时被破坏。但是好像没有
  • @user2976267 试试这个答案....stackoverflow.com/a/6198068/3678308
  • 您是否在删除片段之前取消注册传感器事件侦听器?

标签: android android-fragments


【解决方案1】:

尝试使用标签从事务中删除片段。像这样的:

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

    MyFragment fragment = new MyFragment();
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.mainLayout, fragment, "FragmentTransaction_1");
    transaction.commit();
}

public void getRidOfFragment(View v){
    MyFragment fragment = new MyFragment();
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.remove(manager.findFragmentByTag("FragmentTransaction_1"));
    transaction.commit();
}

【讨论】:

  • 谢谢,但我指定我尝试了 remove() 并且已删除片段中的传感器继续反应并仍然播放声音等。片段与活动分离但显然没有被破坏
【解决方案2】:

这是一个老问题,但为了完整起见,正确的方法是在片段内创建一个方法来停止传感器;在删除片段之前调用此方法。

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多