Android:从双窗格(横向)布局切换到单窗格(纵向)布局,如何处理列表和细节片段的切换
背景和介绍 我的应用程序由一个活动和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替换。如果我随后将方向更改为双窗格模式,我将看到两个碎片详细信息 我尝试过的 我对这个问题一无所知,也不知道该怎么办。目前我所能得到的只是在细节容器内的碎片标签。有了这个标签,我就能找到碎片Android:从双窗格(横向)布局切换到单窗格(纵向)布局,如何处理列表和细节片段的切换,android,android-fragments,Android,Android Fragments,背景和介绍 我的应用程序由一个活动和3个片段组成。该应用程序仅在两个窗格中以600dp的最小宽度浏览,仅在横向视图中。在纵向方向上,它是在单个窗格中查看的,也不管大小 下面是它的概览 单窗格模式 双窗格模式 快速描述此应用程序的功能。在单窗格模式下,碎片列表添加到容器(R.id.list\u容器)。按下项目时,其容器将替换为包含说明和按钮的fragmentBDetail。按下此按钮将进入FragmentC。FragmentBDetail和FragmentC被添加到后堆栈中,因此用户可以导航回
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();
}