用旋转器,活动结构切换片段

时间:2014-03-04 20:19:40

标签: android android-fragments android-listfragment fragmenttransaction setcontentview

目前,我有一个setContentView包含listfragment布局的活动。基本上它加载了一个列表视图。

我的操作栏包含一个微调器,可以让我加载到不同的列表中。我可以在后台加载List Objects,并在用户使用spinner选项切换到这些列表时更新一个片段的适配器。但这不会保留用户滚动到的位置。

我想要加载多个listfragments,当用户选择不同的spinner选项时,会发生一个片段事务,显示与该特定列表关联的其他listfragments之一。

我该如何做,以及如何修改我的主机活动?

我看到FragmentTransaction使用的示例涉及在主机活动的onCreate方法中创建所有片段,而在XML中没有片段。现在我在XML中有一个片段,需要再创建两个几乎完全相同的ListFragments。

洞察力赞赏

2 个答案:

答案 0 :(得分:2)

您看到在onCreate()方法中添加片段而不是直接将它们放入XML中的原因是因为无法删除/修改XML中包含的片段。如果您必须拥有此片段并希望加载其他片段,则可以将容器(如LinearLayout,RelativeLayout等)添加到父容器中,然后通过代码动态设置其属性。一个例子是:

LinearLayout layoutD = new LinearLayout(this);
layoutD.setId(R.id.layoutd);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
layoutD.setLayoutParams(params);
layoutD.setOrientation(LinearLayout.VERTICAL);
parent.addView(layoutD); // parent is a reference to the parent widget in the XML
getSupportFragmentManager.beginTransaction().add(R.id.layoutd, your_fragment_here).addToBackStack(null).commit();

希望这有帮助。

答案 1 :(得分:1)

您似乎可以以编程方式从here滚动ListView:

分别用于直接/平滑滚动:

 getListView().setSelection(21);

 getListView().smoothScrollToPosition(21);

在ListView的getView方法中,您可以记录最后一个View渲染的位置

 @Override
 public View getView(int position, View arg1, ViewGroup arg2) {
 // TODO Auto-generated method stub

因此,当您重置列表视图时,您可以滚动到用户所在的上一个位置,只保留其滚动位置的整数记录。

我意识到你也在考虑片段解决方案。我知道“替换”方法会导致被替换的片段破坏它的视图(至少是“支持”片段处理它的方式)。因此,在这种情况下,您仍然返回到丢失其滚动状态的列表视图。您可以尝试隐藏/显示片段事务,因为它们可能会保留其视图,从而滚动状态。

如果您尝试隐藏/显示告诉我结果:)如果它有效,我可以自己使用它。