我试图创建一个嵌套在片段中的FragmentTabHost。这个概念正在起作用,除了一件令我疯狂的事情。在.addTab()方法中,我将动态创建的fragment.getClass作为第二个参数,如下所示:
mTabHost.addTab(
mTabHost.newTabSpec("Tab1").setIndicator(adapterlist[0], null),
SiteDetailsFragment.newInstance(test1).getClass(), null);
在.newInstance()方法中,test1参数是一个ArrayList,该片段在每行中使用TextViews和EditTexts动态创建一个Tablelayout,其中包含列表包含的数据。 adapterlist []是一个简单的字符串数组。
这很好。
问题是:我想从不同的SiteDetailsFragment实例创建更多标签,如下所示:
for (int i=0;i<=currentDetailsList.size()-1;i++) {
mTabHost.addTab(mTabHost.newTabSpec("tab" + i)
.setIndicator(adapterlist[i], null),
SiteDetailsFragment.newInstance(currentDetailsList
.get(i)).getClass(),null);
}
currentDetailsList是列表列表,实例之间的差异是.newInstance()方法中的给定列表。 此循环将创建由currentDetailsList定义的确切数量的选项卡,但所有选项卡的内容是由最后一个列表项创建的实例,我不知道为什么。我尝试了很多东西,但也许我错过了一些东西。 如果有人有建议,我想阅读。
谢谢!
答案 0 :(得分:0)
问题很可能发生,因为您正在创建SiteDetailsFragment
的新实例,但基本上将其丢弃。我的猜测是你的SiteDetailsFragment.newInstance()
正在存储静态数据,它不应该存储。您要做的是将ArrayList
放入Bundle
并将其提供给.addTab()
。例如:
Bundle args = new Bundle();
args.putStringArrayList(ARG_NAME, test1);
mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator(adapterlist[0], null),
SiteDetailsFragment.class,
args);
这假设您的test1
列表只是String
个对象的列表。如果它是Parcel
支持的其他内容,那么您需要使用正确的Bundle
方法来添加它。
addTab()
方法使用Fragment.instantiate()
方法创建您提供的类(名称)的新Fragment
对象,并将提供的Bundle
设置为参数;与您手动创建的典型newInstance()
方法相同。