片段和framelayout的布局由另一个片段和framelayout替换

时间:2011-07-20 19:55:14

标签: android android-fragments

修改

所以在下面的评论之后,我重新审视并意识到是什么让我感到高兴。

想象一下,我的客户列表和客户详细信息活动可以通过以下方式启动:

public class ClientsMainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //StudioTabOpenHelper db;
        setContentView(R.layout.main_client_activity);
    }
}

所以这很好用,启动我的main_client_Activity(在下面的布局中定义,当我点击主屏幕上的按钮时我调用此活动):

Intent intent = new Intent(getActivity(), ClientsMainActivity.class);
startActivity(intent);

问题很简单,ClientsMainActivity不会调用OnCreateView或任何东西,只需将布局设置为定义我的Fragment和我的ListFragment的布局。这很好,因为我没有尝试将任何内容传递到ClientsMainActivity,但如果我有一个假设的活动,如:

SessionMainsActivity当他们点击客户端的会话编辑时调用,然后我不会以相同的方式调用SessionsMainActivity(启动只设置为alayout的活动),我想要布局设置,因为它定义了我的片段是如何分裂的。但是我也希望将数据传递给它,然后传递给后续片段(比如他们点击哪个会话进行编辑/删除。

所以我想知道上述是否有意义,我确信这是一件简单的事情,我无法将自己的大脑包裹起来。我没有问题从其他片段调用FragmentActivitie,它们占据了整个屏幕,但它有效。所以我想最重要的问题是ClientsMainActivity来自我在网上找到的一些例子,用于制作食谱,向您展示如何在屏幕上制作多个片段。让我完成FragmentActivity所做的事情就是将内容视图设置为一个完成所有工作的布局,这就是为什么我无法弄清楚如何编写它来做同样的事情但是让我将值传递给布局定义的片段等...

结束编辑

所以我在这里使用这个漂亮的小教程:

http://developer.android.com/guide/topics/fundamentals/fragments.html

它让我走了很长的路,并利用他们对主要活动所做的事情,以及fragment_layout.xml,我在左边有一个很好的客户列表(这是一个列表碎片),右边是一个细节片段。

然后我添加了在客户端上编辑会话信息的功能(或编辑客户端详细信息),这两者都是全屏片段。这很有效。

现在我决定我的会话编辑ui最好能够将信息再次分成两个窗格。

这不像我想象的那样,就像我说我在onCreate中有一个main_Activity这样做:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_client_activity);
}

main_client_activity.xml在两个布局中定义,但横向平板电脑的布局在此处:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <fragment class="com.viciousbytes.studiotab.subactivities.ClientListView"
        android:id="@+id/client_list" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent" />

   <FrameLayout android:id="@+id/client_details" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground"/>

</LinearLayout>

这一切都很棒!在这种情况下,我处理了其他所有内容,作为一个启动自己片段的全屏活动:

EditSessionActivity EditClientActiivyt这两个都使用getSupportFragmentManager()。beginTransaction,我可以从.newInstance调用中将信息传递给它。

我使用按钮,文本视图等定义了我的session_edit.xml布局。这很有效。多数民众赞成我在SessionEdit片段中加载的EditSessionActivity片段“由我<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.viciousbytes.studiotab.subactivities.SessionEdit" android:id="@+id/session_edit" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/invoice_details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent" android:background="?android:attr/detailsElementBackground" /> </LinearLayout> 启动”但是现在因为我想将它分开,我遇到了障碍。上面我定义了一个client_list和一个client_details id,这些占位符是否在我的屏幕上?当我想用完全不同的片段替换那里的那些时,我会引用那些吗?

或者我是否构建另一个名为fragment_session_layout的片段布局,它定义了类似的东西:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int clientID = getIntent().getIntExtra(THE_SELECTED_CLIENT, -1);            
    int sessionID = getIntent().getIntExtra(SELECTED_SESSION,-1);
    SessionEdit edits = SessionEdit.newInstance(this.getBaseContext(), false, clientID, sessionID);
    mUIListener = (OnUpdateUI)edits;
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, edits).commit();
}

抱歉,我不知道在我的舌头上用什么标题来说明这一点,基本上是如何两次将两个片段放在一起。这个在线演示展示了如何做一个(以及一个简单的ListFragment)。

我已经完成了以上所有操作,我只是无法弄清楚如何将片段传递给片段我需要的数据,我在EditSessionActivity中使用它:

EditSessionActivit

虽然有效,但是为了尝试遵循早期的片段示例,我假设我的MainActivity y有点像制作另一个onCreate(因为它有两个面板,就像主面板一样)。所以我用{:}}重新编码了EditSessionActivity中的@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.edit_session_fullview); }

onCreate

在我处理onCreateView的EditSession片段中进行战斗之后,我得到了最终的工作,但是无法传递数据,因为没有使用像之前edits=SessionEdit.newInstance(...)那样的对象的实例化{1}}

这样做是很好的做法是做其他片段布局,其中有两个难点,并在触发正确的操作时启动它。或者是否应该替换已经创建的两个片段?来自我的main_client_activity.xml不知何故?

1 个答案:

答案 0 :(得分:3)

我假设编辑客户端和编辑会话是两个不同的活动。当您从“编辑客户端”切换到“编辑会话”模式时,“列表”和“详细信息”窗格都会更改?

我会选择两个布局文件,而不是尝试重用相同的布局并重新加载片段。

如果您尝试重复使用相同的布局,则必须:

  • @+id/invoice_details更改为@+id/right_pane之类的内容。否则,将与会话相关的内容加载到“invoice_details”占位符中会让人感到困惑。
  • 将片段定义替换为另一个FrameLayout,并在运行时加载ClientListViewSessionListView(或者它被称为)片段。

在我看来,这会比添加另一个布局xml文件增加更多的复杂性。

所以

  • 使用适用于客户列表和客户详细信息的现有代码
  • 复制所有涉及的部分,并更改需要更改的内容,以便现在是会话列表和会话详细信息
  • 删除易于操作的复制(常用功能转到实用程序类,布局包含常用布局元素)。保留那些难以按原样重复删除的内容。
  • 稍后重新评估,当您有更多片段,更多布局和更多经验时。

更新,可以在活动中嵌入两种不同的方法片段

正如Android文档所述,有两种主要方法可以让您的活动中显示片段:

  • 在布局的XML文件(<fragment class=.... />
  • 中声明片段
  • 在布局的XML文件中放置占位符FrameLayout并在运行时加载片段

当片段不需要接收任何参数时,第一种方法很好。例如,如果检索单个且仅有客户端列表的逻辑在片段代码中是硬编码的。

第二种方法允许您将参数传递给片段,因此适用于“详细信息钻取”类型的片段。

从更新的问题我明白了,

  • 每个客户都有一个单独的会话列表
  • 游戏中的组件是:EditSessionActivity,其中包含两个片段,一个用于显示会话列表,另一个用于显示会话详细信息

如果这是正确的,那么你确实需要以编程方式加载这两个片段,因为两者都需要传递参数。所以你的布局会有两个FrameLayoutEditSessionActivity将首先从intent获取一些参数(“我们正在使用哪个会话列表?”),并使用这些参数加载“会话列表”片段。当用户选择该片段中的列表项时,另一个片段将加载会话详细信息。