此答案由@Taylor克拉克是相当翔实。但是,这并不是我在原始问题中提出的使用单一活动方法的实际经验共享。我着手修改Android开发人员指南中的新闻阅读器示例,以使用单一活动方法,并提出了一个可行的解决方案。
尚待观察的是什么情况下这种方法比多重活动方法更可取(或者根本没有这样的情况)。另外,我没有详细研究问题编辑1中描述的3窗格方案。
我希望很快发布我的整个项目,但这是我如何进行的快速概述:
- 单曲
Activity
:NewsActivity - 两个片段:
TitlesListFragment
和DetailsFragment
- 这两个片段始终存在于中
NewsActivity
。根据当前的双重窗格,我显示/隐藏适当的片段。
我遇到的一些问题:
是否将布局指定为双窗格:
在原始的新闻阅读器示例中,双窗格布局具有
frameLayout用于保存新闻详细信息的。通过测试是否存在此帧布局,我们可以确定我们当前是否处于双窗格布局。
但是,在我的解决方案中,两个片段始终存在于所有布局中。我通过包含破解这
View与ID
dualPane,并
android:visibility="gone"在这些布局,我想成为的双窗格和省略的单面板布局这一观点。然后,这是一个问题
mDualPane = findViewById(R.id.dualPane)!=null;
编辑:
与拥有虚拟视图相比,有更好的方法来指定双重窗格。我更喜欢的是创建一个布尔资源。例如,我有
config.xml如下内容:
<resources> <bool name="dual_pane">false</bool></resources>
然后,我可以将其他
config.xml文件放在
values-xlarge-land,
values-port或
values-sw600dp等文件夹中,并根据需要将布尔值调整为
true或
false。
然后,在代码中
getResources().getBoolean(R.bool.dual_pane);
关闭细节片段
这是区分
Activity收盘价和
Fragment收盘价的问题。最后,我必须重写
onBackPressed()如下:
- 在双窗格模式下,只需调用
super.onBackPressed()
; - 在单窗格模式下,如果我们在
TitlesListFragment
,请致电super.onBackPressed()
; - 在单窗格模式下,如果我们在
DetailsFragment
,则将其视为关闭片段。这意味着将其隐藏并显示TitlesListFragment
。
这不是理想的,但是这是我能想到的最好的方法。
编辑 :
根据@SherifelKhatib在评论中的建议,有一种更简洁的方法可以处理后退按钮的操作:只需将其显示/隐藏明细片段的事务添加到Fragment
backstack中即可。这样,当您按下“后退”按钮时,片段事务将被撤消。如果您希望单击其他按钮,也可以手动弹出后退堆栈。



