【发布时间】:2011-07-20 19:55:13
【问题描述】:
编辑:
所以在下面的 cmets 之后,我重新审视并意识到是什么让我陷入困境。
想象一下我的客户列表和客户详细信息活动由以下人员开始:
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(启动仅设置为布局的活动),我希望该布局设置为它定义了我的片段是如何拆分的。但我也想将数据传递给它,然后传递给后续的片段(比如他们点击哪个会话进行编辑/处理。
所以我想知道以上是否有道理,我确信这是一件简单的事情,我无法将我的大脑包裹起来。我从其他片段调用FragmentActivities 没有问题,它们占据了整个屏幕,但它可以工作。所以我想最大的问题是ClientsMainActivity 来自我在网上找到的一些示例,用于制作向您展示如何在屏幕上制作多个片段的食谱。让我得到FragmentActivity 所做的所有事情就是将内容视图设置为一个可以完成所有工作的布局,所以这就是为什么我不知道如何编写代码来做同样的事情,但让我通过布局定义的片段的值等等......
结束编辑
所以我在这里使用这个不错的小教程:
http://developer.android.com/guide/topics/fundamentals/fragments.html
它让我走了很长一段路,并利用他们所说的主要活动和 fragment_layout.xml,我在左边有一个很好的客户列表(那是一个 listfragment),在右边有一个细节片段。
然后我添加了在客户端上编辑会话信息(或编辑客户端详细信息)的功能,这两者都是全屏片段。这效果很好。
现在我决定我的会话编辑 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();
}
这行得通,但是为了尝试遵循前面的片段示例,我假设我的EditSessionActivity 有点像制作另一个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?
【问题讨论】:
-
我现在有同样的“问题”,我在视图中有 2 个列表片段,并且在选择一行后我正在动态更改。我认为很多哪个更好,但我不认为这是我用过的最好的方法。
-
网上的这些片段的例子对于简单的案例来说通常已经足够了,但除此之外,你就得靠你自己了。希望有人有好的建议。
-
我同意你的看法,本教程适用于基本情况,如果有人想用片段创建复杂的 UI,他需要多想:D
-
我不介意想我只是想知道做事的正确方法,以便将来不创建纸牌屋软件 :) 我现在甚至正在与我创建的 DialogFragment 搏斗使用他们的教程,它可以工作,但作为自己的 UI“页面”出现,而不是作为“悬停”在其他内容之上的对话框,不确定我做错了什么。我的日期/时间对话框片段虽然 Shrug 工作得很好