Android 无法删除屏幕方向更改时的碎片

Android 无法删除屏幕方向更改时的碎片,android,android-fragments,Android,Android Fragments,我希望我的应用程序在设备处于纵向模式时显示一个片段,在设备处于横向模式时显示两个片段 一个片段包含ListView并始终显示,第二个片段包含有关所选列表项的更多详细信息,仅在横向模式下显示 第一个片段使用通信器模式与应用程序通信 我已经设置了两个布局文件,每个方向一个,一切正常 问题是,当我以横向模式运行应用程序并将其旋转回纵向时,第二个片段虽然不可见,但仍然存在,这意味着: getFragmentManager().findFragmentById(R.id.detailsFragment)

我希望我的应用程序在设备处于纵向模式时显示一个片段,在设备处于横向模式时显示两个片段

一个片段包含ListView并始终显示,第二个片段包含有关所选列表项的更多详细信息,仅在横向模式下显示

第一个片段使用通信器模式与应用程序通信

我已经设置了两个布局文件,每个方向一个,一切正常

问题是,当我以横向模式运行应用程序并将其旋转回纵向时,第二个片段虽然不可见,但仍然存在,这意味着:

getFragmentManager().findFragmentById(R.id.detailsFragment) == null // false
我认为这与android没有自动关闭不必要的片段有关,因此在我的activity的onCreate方法中,我尝试添加:

if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    if (getFragmentManager().findFragmentById(R.id.detailsFragment) != null) {
        Log.v(DEBUG_TAG, "There is a details Fragment in portrait mode - removing");
        getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.detailsFragment)).commit();
    }
}
尽管显示了日志消息,这意味着没有重大错误/打字错误等,但该片段不会被删除

我刚刚更改了列表项单击处理程序,以记录当前配置中是否存在detailsFragment:

@Override
public void listItemClicked(int index) {
    if(getFragmentManager().findFragmentById(R.id.detailsFragment) != null){
        Log.v(DEBUG_TAG,"There is a details Fragment");
    } else {
        Log.v(DEBUG_TAG,"No details Fragment!");
    }
}
当我在肖像上运行应用程序时,我得到了预期的“无细节片段”

当我在景观上运行它时,我得到了预期的“有一个细节片段”

当我在横向上运行它,然后切换到纵向,它会记录“有一个细节片段”,即使我已经删除了它


我做错了什么?我如何列出我的应用程序的所有片段,以便查看问题所在?

为什么要删除
片段
?如果纵向布局中没有容器,则不会创建任何UI,只会保留横向布局状态。在任何情况下,我都无法在框架或支持库中重现您的问题(使用Galaxy S2和Jelly Bean)。@corsair992如果应用程序处于纵向模式,它将启动一个新活动来显示详细信息片段,而不是更新详细信息片段。两个问题。留下碎片不是一种坏习惯吗?如果不是,我是否应该在每次单击时检测方向并相应地采取行动?不,保留
片段不是一种坏做法-事实上恰恰相反,因为它可以确保在恢复时保留其状态。单击列表项时,应根据布局进行操作(因为可能会添加方向以外的其他条件)。您可以通过删除纵向布局中的详细信息
片段
容器,然后动态检查它的存在来实现这一点。这就是它在
Fragment
文档参考中的示例流、API演示中的
FragmentLayout
示例以及Eclipse和Android Studio中的主/细节流模板中的实现方式。