我希望实现这样的导航(下图),其中片段A,B,C,D表示向下导航应用程序的信息层次结构。
在手机上只能看到一个片段,在平板电脑上有两个片段可见。
我见过的所有教程和文档(例如this和this)都提到了Master-Detail视图,左边有一个主片段和一个细节在右边看,但似乎没有人指定如何从细节深处钻孔。
事实上,平板电脑的GMail应用程序可以作为我自己的应用程序。让我们说片段A是帐户和文件夹列表,片段B是电子邮件列表,片段C是会话本身。
此屏幕是带有片段A和B的配置
此屏幕包含片段B和C.
问题是:我是否应该使用单个Activity实现此功能,其中
如果是这样,我将如何插入新片段?在FragmentTransaction中,我有两个可用的操作 - add()
和replace()
。
add()
,那么下面的片段似乎还活着(它们不会进入暂停状态)并保持其完整状态(但可能会浪费一些资源)(所以在片段D中,所有C,B和A仍将存在),并且在后退按钮上滚动状态和加载的数据仍将存在replace()
,则前一个片段将被删除,因此在任何时刻顶部只会有一个(在电话上)片段,而在后退按钮上,事务将被撤消,旧片段加回来了,但它不记得以前的状态这些选项对我来说都不合适。教程在FragmentTransaction中使用replace() - 但是它们如何恢复前一个片段的状态,例如在GMail应用程序中,电话片段B从服务器加载无限滚动,然后当我用片段C替换它时然后回去,B应该出现在它离开的地方,对吗?
我真的不知道该做什么或在哪里看,请告知。
答案 0 :(得分:7)
仅使用1个活动,但每个活动使用不同的FragmentTransactions。使用LinearLayout作为活动的根,我们称之为R.id.content
并在以下位置创建一个新的XML值:
/values/device.xml
<item type="bool" format="boolean" name="isPhone">true</item>
/values-sw600dp/device.xml
<item type="bool" format="boolean" name="isPhone">false</item>
那么您的交易就像:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Frag_C f = new Frag_C();
if(getResources().getBoolean(R.bool.isPhone)){ // phone
ft.replace(R.id.content, f, Frag_C.TAG);
}else { // tablet
Fragment left = getSupportFragmentManager().findFragmentByTag(Frag_A.TAG);
Fragment right = f;
ft.hide(left);
ft.add(R.id.content, right, FRAG_C.TAG);
}
ft.addToBackStack(null).commit();
作为最后一点,当给每个片段充气时,必须设置LinearLayout的布局参数WEIGHT
来控制片段的宽度。这样的事情:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(layoutId(), container, false);
((LinearLayout.LayoutParams) v.getLayoutParams()).weight = 1;
}
所以fragA权重为1,则B = 2,则C = 4,然后D = 8(例如)。所以左边的碎片宽度为33%,右边的宽度为66%。根据需要改变价值观。
如果您想知道如何设置这些交易的动画,请参阅我在https://stackoverflow.com/a/14155204/906362之前提供的答案
答案 1 :(得分:1)
我为你的问题做了一些研究,我不认为同样的程序对手机和桌子有效,但如果是这样的话,请查看:
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
这是负责更改片段的代码的一部分,最初取自Here
本教程介绍了完成平板电脑设计的所有步骤。
每当我需要android帮助时,我都会参考这个网站! 享受!!
答案 2 :(得分:1)
如您所知,细分适用于reusing GUI parts。
通过我必须承认我没有看到直接解决A-B B-C C-D
方案的代码示例或教程,但这甚至涉及各种活动。如果活动1可以使用B的分段实例,那么活动2可以运行其自己的B分段实例。您还可以直接从应用程序中(和外部)的其他位置链接到活动2。
在活动1之外定义B段,并在A-B和B-C中使用in。然后startActivityForResult()
活动2,它实例化另一个B段。当用户使用后退按钮时,它们应该以活动1结束,并显示其B段的最新状态。
你甚至可以尝试在一个活动中进行所有段重用..但我没有看到除了GUI过渡动画之外的优势。