1

ドキュメントについて私が理解していることから、フラグメントをデタッチして後で再アタッチすると、デタッチされたときと同じように自動的に表示されます。それ以上のことはありますか?2 つの異なるフラグメント用の 2 つのボタンを備えたシンプルなアクション バーがあります。最初のフラグメントから 2 番目のフラグメントに戻すと、最初のフラグメントに読み込まれた画像が長く表示されます。アタッチ/デタッチを間違って使用していますか、それとも instanceState を自分で管理して UI を再描画する必要がありますか? もしそうなら、attach メソッドと detach メソッドのポイントは何ですか?

   @Override
public void onStart(){
    super.onStart();    
    ndi=new NasaDailyFragment(this);
    bnf=new BreakingNewsFragment(this);
   ft=getFragmentManager().beginTransaction();
   ft.add(R.id.focused_view_container,ndi).commit();

}

public void onTabSelected(Tab tab, FragmentTransaction f) {

switch(tab.getPosition()){
case 0:
    ft=getFragmentManager().beginTransaction();
    if(!ndi.isAdded()){ 
        ft.replace(R.id.focused_view_container, ndi).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit();
        ft.attach(ndi);
        getFragmentManager().executePendingTransactions();
    }

    break;
case 1:
        ft=getFragmentManager().beginTransaction();
        ft.detach(ndi);
        ft.replace(R.id.focused_view_container, bnf).commit();
        getFragmentManager().executePendingTransactions();
     break;
}

}

4

3 に答える 3

1

アタッチとデタッチの代わりに、表示と非表示を使用します。これがサンプルコードです。

 private class MyTabListener implements ActionBar.TabListener {
    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {

        switch (tab.getPosition()) {
        case 0:

            if (frag1 == null) {
                // If not, instantiate and add it to the activity
                frag1 = Fragment.instantiate(getApplicationContext(),
                        FeedsActivity.class.getName());
                ft.add(android.R.id.content, frag1, "Feeds");
            } else {
                // If it exists, simply attach it in order to show it
                ft.show(frag1);
            }
            return;

        case 1:
            if (frag2 == null) {
                // If not, instantiate and add it to the activity
                frag2 = Fragment.instantiate(getApplicationContext(),
                        ProfileActivity.class.getName());
                ft.add(android.R.id.content, frag2, "Profile");
            } else {
                // If it exists, simply attach it in order to show it
                ft.show(frag2);
            }
            return;
        case 2:

            if (frag3 == null) {
                // If not, instantiate and add it to the activity
                frag3 = Fragment.instantiate(getApplicationContext(),
                        History.class.getName());
                ft.add(android.R.id.content, frag3, "History");
            } else {
                // If it exists, simply attach it in order to show it
                ft.show(frag3);
            }

            return;

        }

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        if (frag1 != null) {
            // Detach the fragment, because another one is being attached
            switch (tab.getPosition()) {
            case 0:
                ft.hide(frag1);
                return;
            case 1:
                ft.hide(frag2);
                return;
            case 2:
                ft.hide(frag3);
                return;

            }

        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
    }
}
于 2013-04-18T07:27:18.807 に答える
0

ロジックに問題があります-フラグメントを置き換えてから再度アタッチするか、場合によってはデタッチしてから置き換えると、冗長になります。置き換えるだけでなく、タブを切り替えるたびに古いフラグメントを破棄します。私はむしろこのように行きたいです:

public void onTabSelected(Tab tab, FragmentTransaction f) {
    switch(tab.getPosition()){
    case 0:
        if(ndi.isAdded()){ 
            f.detach(bnf);
            f.attach(ndi);
        }else{
            f.add(R.id.focused_view_container, ndi).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        }
    break;
    case 1:
        if(bnf.isAdded()){ 
            f.detach(ndi);
            f.attach(bnf);
        }else{
            f.add(R.id.focused_view_container, bnf).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        }
     break;
}

また、渡された FragmentTransaction OnTabSelected イベントで commit を呼び出す必要はありません。

于 2013-08-02T14:04:22.660 に答える
-1

デフォルトでは、Fragmentデタッチしてからアタッチすると、 が再作成されます。setRetainInstance(true)を呼び出すことで、この動作を変更できますFragment。実際のインスタンスはメモリに保持され、デタッチ/アタッチ サイクル後に再作成されません。ただし、 の UI は両方の方法で破棄され、その後再作成されるため、 を に再アタッチしたFragment後、ビューに適切なデータを入力していることを確認する必要があります。お役に立てれば。FragmentActivity

于 2013-03-03T09:19:29.983 に答える