Android:从双窗格(横向)布局切换到单窗格(纵向)布局,如何处理列表和细节片段的切换

Android:从双窗格(横向)布局切换到单窗格(纵向)布局,如何处理列表和细节片段的切换,android,android-fragments,Android,Android Fragments,背景和介绍 我的应用程序由一个活动和3个片段组成。该应用程序仅在两个窗格中以600dp的最小宽度浏览,仅在横向视图中。在纵向方向上,它是在单个窗格中查看的,也不管大小 下面是它的概览 单窗格模式 双窗格模式 快速描述此应用程序的功能。在单窗格模式下,碎片列表添加到容器(R.id.list\u容器)。按下项目时,其容器将替换为包含说明和按钮的fragmentBDetail。按下此按钮将进入FragmentC。FragmentBDetail和FragmentC被添加到后堆栈中,因此用户可以导航回

背景和介绍

我的应用程序由一个活动和3个片段组成。该应用程序仅在两个窗格中以600dp的最小宽度浏览,仅在横向视图中。在纵向方向上,它是在单个窗格中查看的,也不管大小

下面是它的概览

单窗格模式

双窗格模式

快速描述此应用程序的功能。在单窗格模式下,碎片列表添加到容器(R.id.list\u容器)。按下项目时,其容器将替换为包含说明和按钮的fragmentBDetail。按下此按钮将进入FragmentC。FragmentBDetail和FragmentC被添加到后堆栈中,因此用户可以导航回FragmentAList

在双窗格模式下,有两个容器(R.id.list\u容器)和(R.id.detail\u容器)。 FragmentAList仍在R.id.list_容器内,但单击某个项目会在同一屏幕上显示R.id.detail_容器内的FragmentBDetail

我遇到的问题

我希望在保持细节片段的同时,当方向发生变化时,能够从双窗格模式转到单窗格模式。i、 e.如果用户处于双窗格模式,他们单击列表中的一个项目以查看详细信息(如窗口描述),当他们切换到纵向(单窗格)时,我希望在单窗格中显示详细信息片段(窗口描述)

同样,如果它位于单个窗格中,并且用户单击列表项以查看其详细信息。我希望当方向改变为横向时,细节片段显示在第二个窗格中

目前,如果我处于双窗格模式,并将方向切换到单窗格,我将只看到碎片。如果我单击一个列表项,我会看到FragmentAlist被FragmentBDetail替换。如果我随后将方向更改为双窗格模式,我将看到两个碎片详细信息

我尝试过的

我对这个问题一无所知,也不知道该怎么办。目前我所能得到的只是在细节容器内的碎片标签。有了这个标签,我就能找到碎片

if(mIsTwoPane)
        {
            Fragment frag = getFragmentManager().findFragmentById(R.id.detail_container);

            if(frag != null)
            {
                Log.d("TEST", "found something = " + frag.getTag());

            }
            else
            {
                Log.d("TEST", "nothing");
            }
        }
我的代码

下面是我认为代码的主要部分。如果你想见其他人,请告诉我

主要活动

在这里,我检查我是否处于双窗格模式。此外,我还将FragmentAList添加到R.id.list_容器中(该容器将始终存在)

碎片主义者

在这里,我从MainActivity获取mTwoPane的值。如果为true,我将变量设置为detail_容器的ID。如果为false,我将设置为R.ID.list_容器的ID(该容器将始终存在)

这在列表视图的onItemClickListener中使用。ContainerID变量包含基于上面在onCreateView中看到的逻辑的容器ID。另外,如果它不在双窗格模式下,我不会将其添加到后堆栈中,只有当它不在双窗格模式下时(因此用户可以导航回列表视图)

@覆盖
public void onItemClick(AdapterView父视图、视图v、整数位置、长id)
{
FragmentTransaction FragmentTransaction=getFragmentManager().beginTransaction();
fragmentTransaction.replace(containerID、FragmentBDetail.newInstance(pos)、FragmentBDetail.class.getName());
fragmentTransaction.setTransition(fragmentTransaction.TRANSIT\u FRAGMENT\u OPEN);
如果(!mIsTwoPane)//不在双窗格模式下
{
fragmentTransaction.addToBackStack(空);
}
fragmentTransaction.commit();
}
谢谢你的阅读

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

        if(findViewById(R.id.detail_container) != null)
        {
            mTwoPane = true;
        }

        if(savedInstanceState == null)
        {
            FragmentAList fragmentAList = new FragmentAList();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.list_container, fragmentAList, FragmentAList.class.getName());
            fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            fragmentTransaction.commit();
        }

    }
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_a, container, false);

        mIsTwoPane = ((MainActivity) getActivity()).getIsTwoPane();

        if(mIsTwoPane)
        {
            containerID = R.id.detail_container;
        }
        else
        {
            containerID = container.getId();
        }

        lvPlatforms = (ListView)view.findViewById(R.id.lvPlatforms);

        return view;

    }
@Override
    public void onItemClick(AdapterView<?> parent, View v, int pos, long id) 
    {


        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.replace(containerID, FragmentBDetail.newInstance(pos), FragmentBDetail.class.getName());
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

        if(!mIsTwoPane) //NOT in two pane mode
        {
            fragmentTransaction.addToBackStack(null);
        }

        fragmentTransaction.commit();


    }