2011-07-20 39 views
5

编辑:布局片段的FrameLayout换成另一个片段的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或任何东西,只是设置布局定义我的片段,我的ListFragment布局。这是好的,因为我不想要任何东西传递到ClientsMainActivity,但如果我有这样一个假设的活动:

SessionMainsActivity当他们点击一个客户端的会话编辑被调用,那么我就不会被调用SessionsMainActivity同样的方式(开始活动,只是设置为alayout),我会想要该布局设置,因为它定义了我的碎片如何分裂。但我也想传递数据到那个然后到后续的片段(比如他们点击的是哪个会话进行编辑/使用

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

编辑完

所以我用这个可爱的小教程在这里:

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

它已经得到了我很长的路要走,并利用他们说的主要活动做什么, fragment_layout.xml,我在左边有一个很好的客户列表(这是一个listfragment),右边有一个细节片段。

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

现在我决定了我的会话编辑UI最好将信息再分成两个窗格。

这是行不通的,因为我觉得,就像我说我有一个main_Activity,这是否在OnCreate:

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布局与按钮,textviews等定义,并且工作很好。多数民众赞成在我的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> 

对不起不知道该怎么这个称号对我的舌尖什么,我问,基本上如何两次得到两片碎片。在线演示展示了如何做一个(以及一个简单的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

+0

我有同样的“问题”现在,我已经得到了在视图listfragments和我改变后dinamically一排selected.I想了很多哪一个是好,但我不认为这是最好的方法我用过的。 – kameny

+0

这些在线片段的例子通常足以满足简单的情况,但除此之外,您还是自己做的。希望有人有一个好的建议。 – Codejoy

+0

我跟你aggree,这个教程适合基本情况,如果有人想创建复杂的UI与他需要想很多片段:d – kameny

回答

3

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

我会去两个布局文件,而不是试图重复使用相同的布局和重新加载片段。

如果你试图重复使用相同的布局,你必须:

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

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

所以

  • 把你现有的代码与客户名单和客户的详细信息工作
  • 复制所有相关零件,并改变需要改变什么,所以它现在会话列表和会话细节
  • 删除它很容易做到的复制(常用功能转到实用程序类,常见布局元素包括布局)。留下难以按原样去重的东西。
  • 以后重新评估,当你有更多的片段,更多的布局和更多的经验。

UPDATE,关于两种不同的方法片段可以嵌入在活动

由于Android文档状态,还有你可以得到一个片段,在你的活动显示主要有两种方式:

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

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

第二种方法可以将参数传递给片段,因此适用于“细节向下”类型的片段。

从更新的问题,我的理解是,

  • 每个客户在游乐活动
  • 成分的单独列表如下:EditSessionActivity承载两个片段,一个用于显示会话列表,另一个用于显示会话详细信息

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

+0

感谢您的答复。我会去解决这个问题。我认为最大的问题是我的布局代码的工作方式是一方是ListFragment,另一方只是一个FrameLayout。所以在我的会话中,我想要两个FrameLayouts(或者在这一点上它们会是碎片?)我想我也很困惑如何在这种情况下将一些复杂的对象(我自己的数据对象)传递给FragmentActivity,也许只是使其可串行化?我没有时间看这个,所以我会仔细检查一下,看看哪个部分特意挂我,并在这里重新发布。 – Codejoy

+0

如果会话内容类似于客户端(左侧会话列表,右侧会话详细信息),那么我认为您的布局也会类似:左侧为ListFragment,右侧为FrameLayout。当在左侧列表上选择项目时,用于编辑会话细节的片段将被加载到FrameLayout中。至于传递数据:无论是可序列化(parcelable)对象还是全局状态。或者,如果对象来自本地sqlite数据库之类的东西,则可以传递数据库ID,并在需要时从DB读取对象。 –

+0

好了更新的问题,以反映我的主要问题。 – Codejoy

相关问题