繁体   English   中英

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

[英]layout with fragment and framelayout replaced by another fragment and framelayout

编辑:

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

想象一下我的客户列表和客户详细信息活动由以下开始:

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 ,但是如果我有一个假设的活动,例如:

当他们单击客户端的 session 编辑时调用的SessionMainsActivity ,然后我不会以相同的方式调用SessionsMainActivity (启动仅设置为布局的活动),我希望设置该布局,因为它定义了我的片段如何拆分向上。 但我也想将数据传递给它,然后传递给后续的片段(比如他们点击哪个 session 进行编辑/处理。

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

结束编辑

所以我在这里使用这个不错的小教程:

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

它让我走了很长一段路,并利用他们所说的主要活动和 fragment_layout.xml,我在左边有一个很好的客户列表(那是一个列表片段),在右边有一个细节片段。

然后我添加了在客户端上编辑 session 信息(或编辑客户端详细信息)的功能,这两个都是全屏片段。 这很好用。

现在我决定我的 Session 编辑 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布局用按钮、文本视图等定义......效果很好。 这就是我在我的EditSessionActivity “启动”的SessionEdit片段中加载的内容,但现在因为我想将它分开,我遇到了障碍。 上面我定义了一个 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>

抱歉,我的舌尖上不知道该用什么标题来问这个问题,基本上是如何将两个片段窗格重复两次。 在线演示展示了如何做一个(以及一个简单的 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 有点像制作另一个MainActivity (因为它有两个面板,就像主面板一样)。 所以我用这个重新编码了EditSessionActivity中的onCreate

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);      
    setContentView(R.layout.edit_session_fullview);
}

在我处理 onCreateView 的 EditSession 片段中战斗之后,我终于让它工作了,但无法传递数据,因为没有像之前的onCreate那样使用具有edits=SessionEdit.newInstance(...)

那么做另一个有两个痛苦的片段布局并在触发正确的操作时启动它是一种好习惯。 还是应该替换两个已经创建的片段? 从我的main_client_activity.xml不知何故?

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

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

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

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

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

所以

  • 使用适用于客户列表和客户详细信息的现有代码
  • 复制所有涉及的部分,并更改需要更改的部分,因此现在是 session 列表和 session 详细信息
  • 在容易做到的地方删除重复(常用功能 go 到实用程序类,常用布局元素到布局包括)。 将难以重复数据删除的内容保留原样。
  • 稍后再评估,当你有更多片段、更多布局和更多经验时。

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

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

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

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

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

从更新的问题中,我了解到,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM