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

Cod*_*joy 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Intent intent = new Intent(getActivity(), ClientsMainActivity.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

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

所以我想知道上述是否有意义,我确信这是一个简单的事情,我无法将我的大脑包裹起来.我没有问题FragmentActivitie从其他片段调用s,它们占用了整个屏幕,但它的工作原理.所以我想最大的问题就是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);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

session_edit.xml用按钮,文本视图等定义了我的布局.这很有效.多数民众赞成我在我的SessionEdit片段中加载的"由我推出" EditSessionActivity但是现在因为我想将它分开,我遇到了障碍.上面我定义了一个client_list和一个client_details id,这些占位符是否在我的屏幕上?当我想用完全不同的片段替换那些时,我会引用那些吗?

或者我是否构建另一个片段布局,称为像fragment_session_layout,它定义如下:

<?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>
Run Code Online (Sandbox Code Playgroud)

对不起,我不知道在我的问题上用什么来标题,这基本上是如何两次拍摄两个片段.在线演示展示了如何做一个(以及一个简单的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();
}
Run Code Online (Sandbox Code Playgroud)

虽然有用,但是为了尝试坚持早期的片段示例,我认为我的EditSessionActivity有点像制作另一个MainActivity(因为它有两个面板,就像主面板一样).所以我重新编码的onCreateEditSessionActivity此:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);      
    setContentView(R.layout.edit_session_fullview);
}
Run Code Online (Sandbox Code Playgroud)

这在我对付onCreateView EditSession片段战斗后,我得到了这最后的工作,但在数据不能通过导致存在使用像以前没有对象实例onCreate其中有edits=SessionEdit.newInstance(...)

因此,做一个有两个难点的其他片段布局并在触发正确的动作时启动它是一种好习惯.或者是否应该替换已经创建的两个片段?从我的main_client_activity.xml莫名其妙?

Pēt*_*une 3

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

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

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

  • 更改@+id/invoice_details为类似的东西@+id/right_pane。否则,将与会话相关的内容加载到“invoice_details”占位符中会看起来很混乱。
  • 将片段定义替换为另一个片段定义FrameLayout,并在运行时加载 或ClientListViewSessionListView或无论如何称呼)片段。

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

所以

  • 采用可处理客户列表和客户详细信息的现有代码
  • 复制所有涉及的部分,并更改需要更改的内容,现在是会话列表和会话详细信息
  • 在容易做到的地方删除重复(公共函数转到实用程序类,公共布局元素转到布局)。将难以删除重复的内容保留原样。
  • 稍后,当你有更多的片段、更多的布局和更多的经验时,重新评估。

更新,大约有两种不同的方法可以将片段嵌入到活动中

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

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

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

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

从更新的问题我了解到,

  • 每个客户端都有一个单独的会话列表
  • 正在运行的组件是:EditSessionActivity托管两个片段,一个用于显示会话列表,另一个用于显示会话详细信息

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