首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在实现多片段配置时构造布局文件(例如.在一个单一的活动架构中?

如何在实现多片段配置时构造布局文件(例如.在一个单一的活动架构中?
EN

Stack Overflow用户
提问于 2014-05-13 15:51:29
回答 2查看 887关注 0票数 3

我目前正在切换到一个single activity architecture,它将管理在container layout中和从一个container layout中加载片段。事情进展得很顺利,但我遇到了一个障碍。我想实现master-detail模式,但我无法找到处理布局文件的最佳方法。我曾经想过两种方法,但这两种方法都有我不喜欢或不确定的后果。

  1. layout-land文件与第二个容器分开:这里的问题是,我不希望第二个容器占用空间,而不是在多片段配置中,所以我忽略了许多可能变得混乱的编程布局参数更改。
  2. nested fragments:我可以加载一个特殊的multi-configuration片段,其布局XML包含嵌套在

我主要是寻求一些指导,我应该采取的方法,无论是我提到的两个选择,或另一个方法,我忽略了。

编辑:,我组装了一个谷歌绘图,它说明了到目前为止我有两个想法。

EN

回答 2

Stack Overflow用户

发布于 2014-05-13 16:14:18

让我们把这个问题分成几个部分:

( 1)使用的是什么类型的装置?(即平板电脑或电话)

2)如果我是一部电话,我的定位是什么?

为了识别您是在平板电脑上运行还是在手机上运行,您可以使用sw800dp桶(希望他们不会拿出800 do宽的手机)让框架在设备宽度小于800 do的情况下膨胀布局。这个布局文件将包含2个静态Fragments或两个容器(ViewGroups用于动态放置Fragments )。如果试图获取两个Fragments中的一个或两个Viewgroups中的一个不返回null,则可以确定您是否处于“平板”配置中。

如果你得到了null,那么你就知道你的设备是一部手机。您可以使用getResources().getConfiguration().orientation确定您是处于横向模式还是纵向模式。

票数 0
EN

Stack Overflow用户

发布于 2014-05-13 16:31:47

编辑:从评论中的讨论中,我看到你的主要问题似乎是方向变化的处理。

  1. 正如Emmanuel所说,当发生配置更改时(您基本上回到了onCreate(),您需要检查getResources().getConfiguration().orientation。据此,您必须检查是否需要删除或添加片段/s。因此,例如,您有一个智能手机的肖像,只有一个片段是存在的。然后你改变为景观,你必须要么
代码语言:javascript
复制
- add a Fragment into old layout or
- remove whole fragment stack and add new layout

  1. 如果您想要为您的片段容器使用旧的布局,就没有办法处理布局参数更改(比如将可见性设置为可见)。如果您不使用旧的布局并创建一个新的布局,则必须保存UI状态,以便用户获得他的选择等等(您可能知道这个东西--使用意图,等等)。

我更喜欢为新的配置创建一个新的布局并重新创建状态,所以我在onCreate()中这样做

代码语言:javascript
复制
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中启动配置

代码语言:javascript
复制
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或控制器或任何已就位的内容传播更改。

我通常使用嵌套的片段,并使用类似的方法来传递更改。

代码语言:javascript
复制
((FragManagedPaging) getParentFragment()).forwardChanges(NotifyState.NOTIFY_ALL, result);

NotifyState是一个枚举,表示更改是否与所有片段或特定片段相关(如果我需要某些片段,则传入类名),或者如果我希望为某个事件(NotifyState.ADD)创建一个新片段,等等。父片段承载其他片段(如果需要的话,也包含ViewPager ),如果存在其他片段,则转发更改。其他片段有一个通知方法,指示要工作。

代码语言:javascript
复制
void onChangeOccurred(Object... args) {
// look what changed, what work to do in args, etc.

但总的来说还是由你来决定。

多窗格布局示例:

代码语言:javascript
复制
<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等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23635952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档