Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用微调器、活动结构切换片段_Android_Android Fragments_Android Listfragment_Fragmenttransaction_Setcontentview - Fatal编程技术网

Android 使用微调器、活动结构切换片段

Android 使用微调器、活动结构切换片段,android,android-fragments,android-listfragment,fragmenttransaction,setcontentview,Android,Android Fragments,Android Listfragment,Fragmenttransaction,Setcontentview,目前,我有一个活动,该活动包含一个包含listfragment的布局的setContentView。基本上,它加载一个listview 我的actionbar包含一个微调器,可以在不同的列表中加载。我可以在后台加载列表对象,并在用户使用微调器选项切换到这些列表时更新一个片段的适配器。但这不会保留用户滚动到的位置 我想乱加载多个listfragments,当用户选择不同的微调器选项时,会发生一个片段事务,显示与该特定列表关联的其他listfragments之一 我将如何做到这一点,以及如何修改我的

目前,我有一个活动,该活动包含一个包含listfragment的布局的
setContentView
。基本上,它加载一个listview

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

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

我将如何做到这一点,以及如何修改我的主机活动

我看到使用的示例包括在宿主活动的
onCreate
方法中创建所有片段,而在XML中不创建片段。现在我在XML中有一个片段,需要再创建两个几乎相同的ListFragment


您看到在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();

希望这有帮助。

您似乎可以通过编程方式从以下位置滚动列表视图:

对于直接/平滑滚动:

 getListView().setSelection(21);

 getListView().smoothScrollToPosition(21);
在ListView的getView方法中,可以记录最后渲染的视图的位置

 @Override
 public View getView(int position, View arg1, ViewGroup arg2) {
 // TODO Auto-generated method stub
因此,当您重置listview时,只需保留用户滚动位置的整数记录,就可以滚动到用户所在的上一个位置

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


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

我不知道替换方法会杀死片段。由于获取listview的当前位置更容易,我可能会在我现在正在开发的应用程序中使用该路线,我不会使用Backback来处理我的frags…因此我不确定这是否会保留它;我确实看到destroyView被称为。这可能更好地回答了我的问题,以防其他人带着类似的碎片相关问题来到这里。但是@NameSpace的答案更好地解决了我的问题