0

我有一个带有 4 个标签的 FragmentTabHost。一个选项卡的内容是在该onViewCreated方法中动态创建的。这是一个表,添加到该表的行数取决于用户设置。

我的问题是,当我(出于测试目的)向表格添加 3 行、切换选项卡并切换回来时,表格中有 6 行。如果我再做一次,我的表中有 9 行。

因此,每次我打开此选项卡时,都会将 3 行添加到表中,而不会删除以前的内容。

如果我做对了,FragmentTabHost 会存储每个 Tabs 片段的状态。所以我在添加行之前检查方法的是否为空savedInstanceStateonViewCreated不幸的是savedInstanceState,总是返回 null。

这是我的 FragmentTabHost 的初始化代码

private void initTabs()
{
    FragmentTabHost tabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);

    tabHost.setup(this, getSupportFragmentManager(),R.id.realtabcontent);
    tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1"), TestFragment1.class, null);
    tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2"), TestFragment2.class, null);
    tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3"), TestFragment3.class, null);
    tabHost.addTab(tabHost.newTabSpec("tab4").setIndicator("tab4"), TestFragment4.class, null);     

    tabHost.setOnTabChangedListener(this);
}

这是选项卡之一的“tableView”片段的代码:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
{
    super.onCreateView(inflater, container, savedInstanceState);
    return inflater.inflate(R.layout.tab_tableview, container, false);    
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) 
{
    super.onViewCreated(view, savedInstanceState);

    Log.d("savedInstanceState", String.valueOf(savedInstanceState)); // is always null

    if (savedInstanceState != null)
        return;

    // Add Test-Rows
    for (int i=0; i<3; i++)
    {
        RowFragment fragment = new RowFragment();
        FragmentTransaction ft = getChildFragmentManager().beginTransaction();
        ft.add(R.id.RowFragmentLayoutContainer, fragment);
        ft.commit();
    }

}

我的代码有什么问题?我必须怎么做才能只添加一次行?

4

1 回答 1

0

嗯,您使用子片段的方式看起来有点奇怪,但如果您有理由使用片段作为表格项(我该判断谁:)),我可以快速想出的最简单的方法是首先尝试查找之前添加的片段:

FragmentManager manager = getChildFragmentManager();
if (manager.findFragmentById(R.id.RowFragmentLayoutContainer) != null)
    return;

for (int i=0; i<3; i++)
{
    RowFragment fragment = new RowFragment();
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(R.id.RowFragmentLayoutContainer, fragment);
    ft.commit();
}
于 2013-10-28T19:30:52.683 回答