使用动态创建的片段将标签添加到嵌套的FragmentTabHost

时间:2014-10-15 11:55:05

标签: java android android-fragments android-tabhost

我试图创建一个嵌套在片段中的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定义的确切数量的选项卡,但所有选项卡的内容是由最后一个列表项创建的实例,我不知道为什么。我尝试了很多东西,但也许我错过了一些东西。 如果有人有建议,我想阅读。

谢谢!

1 个答案:

答案 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()方法相同。