0

4 つのタブを持つ FragmentTabHost があります。1 つのタブのコンテンツは、メソッド内で動的に作成されますonViewCreated。これはテーブルであり、このテーブルに追加される行の量はユーザー設定によって異なります。

私の問題は、(テスト目的で)テーブルに3行を追加し、タブを切り替えて元に戻すと、テーブルに6行あることです。もう一度行うと、テーブルに 9 行あります。

したがって、このタブを開くたびに、以前のコンテンツが削除されることなく、3 行がテーブルに追加されます。

うまくいけば、FragmentTabHost は各タブ フラグメントの状態を格納します。したがって、行を追加する前savedInstanceStateに、onViewCreatedメソッドの が null かどうかを確認します。残念ながら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);
}

これは、タブの 1 つの「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();
    }

}

コードの何が問題になっていますか? 行を 1 回だけ追加するにはどうすればよいですか?

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 に答える