我目前正在切换到一个single activity architecture,它将管理在container layout中和从一个container layout中加载片段。事情进展得很顺利,但我遇到了一个障碍。我想实现master-detail模式,但我无法找到处理布局文件的最佳方法。我曾经想过两种方法,但这两种方法都有我不喜欢或不确定的后果。
layout-land文件与第二个容器分开:这里的问题是,我不希望第二个容器占用空间,而不是在多片段配置中,所以我忽略了许多可能变得混乱的编程布局参数更改。nested fragments:我可以加载一个特殊的multi-configuration片段,其布局XML包含嵌套在我主要是寻求一些指导,我应该采取的方法,无论是我提到的两个选择,或另一个方法,我忽略了。
编辑:,我组装了一个谷歌绘图,它说明了到目前为止我有两个想法。
发布于 2014-05-13 16:14:18
让我们把这个问题分成几个部分:
( 1)使用的是什么类型的装置?(即平板电脑或电话)
2)如果我是一部电话,我的定位是什么?
为了识别您是在平板电脑上运行还是在手机上运行,您可以使用sw800dp桶(希望他们不会拿出800 do宽的手机)让框架在设备宽度小于800 do的情况下膨胀布局。这个布局文件将包含2个静态Fragments或两个容器(ViewGroups用于动态放置Fragments )。如果试图获取两个Fragments中的一个或两个Viewgroups中的一个不返回null,则可以确定您是否处于“平板”配置中。
如果你得到了null,那么你就知道你的设备是一部手机。您可以使用getResources().getConfiguration().orientation确定您是处于横向模式还是纵向模式。
发布于 2014-05-13 16:31:47
编辑:从评论中的讨论中,我看到你的主要问题似乎是方向变化的处理。
onCreate(),您需要检查getResources().getConfiguration().orientation。据此,您必须检查是否需要删除或添加片段/s。因此,例如,您有一个智能手机的肖像,只有一个片段是存在的。然后你改变为景观,你必须要么- add a Fragment into old layout or
- remove whole fragment stack and add new layout
我更喜欢为新的配置创建一个新的布局并重新创建状态,所以我在onCreate()中这样做
if (CheckApp.isScreenBig()) {
setContentView(R.layout.frag_multi);
} else {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// search and remove former fragments, if there were any
setContentView(R.layout.frag_multi);
} else {
if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
getSupportFragmentManager().beginTransaction().add(android.R.id.content, new FragSingle()).commit(); // single Fragment
}
}
}检测多配置,例如,如下所示的确定设备是智能手机还是平板电脑?
在您的活动中,在onCreate中启动配置
if (App.isScreenBig()) {
setContentView(R.layout.frag_multi);
} else {
if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
getSupportFragmentManager().beginTransaction().add(android.R.id.content, new FragMainPaging()).commit(); // single Fragment
}
}根据您的总体设计,您不需要做更多的事情。如果需要在片段之间进行交互,可以通过父片段的/活动的ViewPager或控制器或任何已就位的内容传播更改。
我通常使用嵌套的片段,并使用类似的方法来传递更改。
((FragManagedPaging) getParentFragment()).forwardChanges(NotifyState.NOTIFY_ALL, result);NotifyState是一个枚举,表示更改是否与所有片段或特定片段相关(如果我需要某些片段,则传入类名),或者如果我希望为某个事件(NotifyState.ADD)创建一个新片段,等等。父片段承载其他片段(如果需要的话,也包含ViewPager ),如果存在其他片段,则转发更改。其他片段有一个通知方法,指示要工作。
void onChangeOccurred(Object... args) {
// look what changed, what work to do in args, etc.但总的来说还是由你来决定。
多窗格布局示例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal" >
<fragment
android:id="@id/frag_travel_list"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="2"
class="de.einschnaehkeee.travel.check.frag.FragTravelBags" />
<fragment
android:id="@id/frag_travel_items"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="3"
class="de.einschnaehkeee.travel.check.frag.FragBag" />
<fragment
android:id="@id/frag_choose_items"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="3"
class="de.einschnaehkeee.travel.check.frag.ChooseItemsFragment" />
</LinearLayout>对于具有多窗格布局的配置,请使用适当的布局目录,如layout-land/frag_multi.xml等。
https://stackoverflow.com/questions/23635952
复制相似问题