Android 用另一个片段和框架布局替换片段和框架布局的布局

Android 用另一个片段和框架布局替换片段和框架布局的布局,android,android-fragments,Android,Android Fragments,编辑: 因此,在下面的评论之后,我重新审视并意识到是什么让我心烦意乱 假设我的客户列表和客户详细信息活动由以下人员启动: public class ClientsMainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //StudioT

编辑:

因此,在下面的评论之后,我重新审视并意识到是什么让我心烦意乱

假设我的客户列表和客户详细信息活动由以下人员启动:

public class ClientsMainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //StudioTabOpenHelper db;
        setContentView(R.layout.main_client_activity);
    }
}
因此,这非常有效,启动了我的主客户端活动(在下面的布局中定义,当单击主屏幕上的按钮时,我调用此活动):

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

SessionMainsActivity
当他们单击客户端的会话编辑时被调用,那么我将不会以相同的方式调用
sessionmainActivity
(启动仅设置为alayout的活动),我希望设置布局,因为它定义了如何分割片段。但我也希望将数据传递给该会话,然后再传递给后续的片段(比如他们单击要编辑/处理的会话)

因此,我想知道上述内容是否有意义,我确信这是一件简单的事情,我只是无法集中我的大脑。我从其他片段调用
FragmentActivitie
s没有任何问题,它们占据了整个屏幕,但它是有效的。因此,我想最大的问题是
ClientsMainActivity
来自我在网上找到的一些用于制作配方的示例它向您展示了如何在屏幕上生成多个片段。
FragmentActivity
所做的一切就是将内容视图设置为一个布局,该布局似乎可以完成所有的工作,这就是为什么我不知道如何编写代码来完成相同的事情,但让我将值传递给布局定义的片段等

结束编辑

所以我在这里使用了这个很好的小教程:

这让我走了很长一段路,利用他们对主要活动所说的,以及fragment_layout.xml,我在左边有一个很好的客户机列表(这是一个listfragment),在右边有一个详细信息片段

然后,我添加了编辑客户机会话信息(或编辑客户机详细信息)的功能,这两种功能都是全屏片段

现在,我决定我的会话编辑界面最好是将信息再次拆分为两个窗格

这并不像我想的那样有效,就像我说的,我有一个主要的_活动,它在onCreate中实现这一点:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_client_activity);
}
在两种布局中定义了
main\u client\u 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>
很抱歉,我不知道在我的舌尖上写什么,基本上是如何获得两个窗格的片段两次。在线演示演示了如何做一个(以及一个简单的ListFragment)

我已经完成了上述所有工作,但我无法确定如何将我需要的数据传递到片段中,我在EditSessionActivity中使用了以下内容:

@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();
}
这是可行的,但为了坚持前面的片段示例,我假设我的
EditSessionActivit
y有点像制作另一个
main活动
(因为它像主活动一样有两个面板)。因此我在
EditSessionActivity
中重新编码了
onCreate

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);      
    setContentView(R.layout.edit_session_fullview);
}
在我的EditSession片段中处理onCreateView之后,我最终实现了这一点,但无法传递数据,因为没有像前面的
onCreate
那样使用对象实例化,后者具有
edits=SessionEdit.newInstance(…)


那么,做另一个有两个麻烦的片段布局并在触发正确的操作时启动它是一种好的做法吗?还是一个应该以某种方式替换从我的
main_client_activity.xml
创建的两个片段?

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

我将使用两个布局文件,而不是尝试重用相同的布局并在其中重新加载片段

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

  • @+id/invoice\u details
    更改为类似于
    @+id/right\u pane
    的内容。否则,将与会话相关的内容加载到“invoice\u details”占位符中看起来会很混乱
  • 将片段定义替换为另一个
    FrameLayout
    ,并在运行时加载
    ClientListView
    SessionListView
    (或其名称)片段
在我看来,这将比拥有另一个布局xml文件更加复杂

所以

  • 使用现有代码处理客户机列表和客户机详细信息
  • 复制所有涉及的部分,并更改需要更改的内容,因此现在是会话列表和会话详细信息
  • 在容易消除重复的地方消除重复(常见功能转到实用程序类,常见布局元素转到布局包含)。保留难以消除重复的内容
  • 当您有更多的片段、更多的布局和更多的经验时,请稍后重新评估
更新,活动中可以嵌入大约两种不同的方法片段

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

  • 在布局的XML文件中声明片段(
  • 在布局的XML文件中放置占位符
    FrameLayout
    ,并在运行时加载片段
当fragment不需要接收任何参数时,第一种方法很好。例如,如果检索单个且唯一的客户机列表的逻辑是在fragment的代码中硬编码的

第二种方法允许您传递argumen
@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();
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);      
    setContentView(R.layout.edit_session_fullview);
}